Shell脚本变量范围与命令

时间:2015-02-18 01:29:12

标签: bash shell variables scope command

我在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 
  • 为什么我必须用`来在后续变量用法中为变量分配o o / p来包围我的命令?

我觉得它与变量命令范围有关。

对我的理解有所了解,我们将不胜感激!

更新: 我尝试了下面的命令,它正在我的环境中工作。

#!/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?)

2 个答案:

答案 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