我在Shell Scripting中遇到了一个有趣的事情,并没有100%确定为什么行为是这样的
我尝试了以下脚本:
#!/bin/sh
CMD="curl -XGET http://../endpoint";
var1=eval $CMD | sed -e 's/find/replace/g';
echo $var1; # Output: printed the value on this line
echo $var1; # Output: blank/no data printed (Why it is blank?)
我不得不在变量封闭中使用back-tick`更改命令,以便根据需要多次打印变量。
CMD="curl -XGET http://../endpoint";
var1=`eval $CMD | sed -e 's/find/replace/g'`;
echo $var1; # Output: printed the value on this line
echo $var1; # Output: printed the value on this line
我觉得它与变量命令范围有关。
对我的理解有所了解,我们将不胜感激!
更新: 我尝试了下面的命令,它正在我的环境中工作。
#!/bin/sh
CMD="curl -XGET http://www.google.com/";
var1=eval $CMD | sed -e 's/find/replace/g';
echo $var1; # Output: printed the value on this line
echo "######";
echo $var1; # Output: blank/no data printed (Why it is blank?)
答案 0 :(得分:2)
sh / bash允许您在其环境中运行带变量的命令,而无需永久修改shell中的变量。这很棒,因为你可以这样做,例如只需一次以某种语言运行命令,而无需更改整个用户或系统的语言:
$ LC_ALL=en_US.utf8 ls foo
ls: cannot access foo: No such file or directory
$ LC_ALL=nb_NO.utf8 ls foo
ls: cannot access foo: Ingen slik fil eller filkatalog
然而,这意味着当你尝试
时var=this is some command
你会触发这种语法。
这意味着“运行命令is a command
并告诉它变量var
设置为this
”
它没有为变量分配“this is my string”,它绝对不会将“this is a string”评估为命令,然后将其输出分配给var
。
鉴于此,我们可以看看实际发生了什么:
CMD="curl -XGET http://../endpoint";
var1=eval $CMD | sed -e 's/find/replace/g'; # No assignment, output to screen
echo $var1; # Output: blank/no data printed
echo $var1; # Output: blank/no data printed
没有范围问题且没有不一致性:变量从未被分配,并且永远不会被echo语句写入。
var=`some command`
(或者最好是var=$(some command)
)有效,因为这是将程序输出分配给变量的有效语法。
答案 1 :(得分:1)
第一个例子并不是你想象的那样。
回声都没有印刷任何东西。让他们echo "[$var1]"
看看。
您需要反对运行命令并捕获其输出。
您的第一次尝试是运行$CMD | sed -e 's/find/replace/g';
管道,其中$CMD
的环境包含var1
设置为eval
的值。
您也不应该将命令放在字符串中(或者通常使用eval
)。有关原因的详情,请参阅http://mywiki.wooledge.org/BashFAQ/001。