Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 这个unix的功能是什么?_Shell_Unix_Scripting - Fatal编程技术网

Shell 这个unix的功能是什么?

Shell 这个unix的功能是什么?,shell,unix,scripting,Shell,Unix,Scripting,你能帮我理解这段代码到底是做什么的吗? 我猜这需要shell脚本中的两个参数,但我不能完全理解带//、%%和##的行的含义。提前谢谢你的帮助 getEnvVal() { tNm=`grep $1 $2` tNm=${tNm//$1} tNm=${tNm%% } tNm=${tNm## } echo $tNm } tNm=`grep$1$2`将grep的输出保存到变量中 tNm=${tNm//$1}删除变量中出现的$1值 tNm=${tNm%%}从变量末

你能帮我理解这段代码到底是做什么的吗? 我猜这需要shell脚本中的两个参数,但我不能完全理解带//、%%和##的行的含义。提前谢谢你的帮助

getEnvVal()
{
    tNm=`grep $1 $2`
    tNm=${tNm//$1}
    tNm=${tNm%% }
    tNm=${tNm## }
    echo $tNm
}
  • tNm=`grep$1$2`
    grep
    的输出保存到变量中
  • tNm=${tNm//$1}
    删除变量中出现的
    $1
  • tNm=${tNm%%}
    从变量末尾移除一个空格
  • tNm=${tNm##}
    从变量开头移除一个空格
  • echo$tNm
    打印变量值
我不建议您使用此脚本,因为它有许多问题:

  • 使用过时的
    `foo`
    构造。您应该使用
    $(foo)
  • grep
    输出的末尾去除换行符。要从
    grep
    获取文本输出,您必须使用如下内容:

    tNm=$(grep "$1" "$2"; printf x)
    tNm=${tNm%x}
    
  • 变量不是
  • 如果
    $1
    包含任何在Bash中具有特殊意义的字符,
    ${tNm//$1}
    很可能会出现意外行为(谢谢@chepner)
  • 作者可能想从行的开始和结束处删除多个空格:

    tNm=${tNm%% *}
    tNm=${tNm## *}
    
  • 如果变量以破折号开头,
    echo
    将异常运行。改用
    printf
  • 变量名没有意义

我查看了你的链接,但它缺少对//行代码的解释,也没有示例,因此我无法理解提供的解释…你能告诉我你的输入($1和$2)是什么,这个函数的输出是什么吗?还有两个潜在问题:1)
$1
没有被引用,因此如果(假设)正则表达式也是一种有效的模式,它将在
grep
看到它之前由shell展开,2)
$1
随后用作模式来修改
tNm
的值。假设
$1
是一个固定字符串,则消除了这两个问题。关于
echo
的建议通常是正确的,但取决于实际使用的shell(因为
echo
是内置的)。例如,对于以连字符开头的参数,bash通常比ksh更健壮。在ksh88中,
print--
是更好的选择,因为
printf
不是内置的。无论如何,如果使用不当,
printf
也会遇到前导连字符问题:try
var=-n;printf“$var”