我有两个问题,可以使用一些帮助来理解它们。
${}
和$()
之间有什么区别?我理解()
表示在单独的shell中运行命令,放置$
表示传递
变量的值。有人可以帮助我理解
这个?如果我错了,请纠正我。
如果我们可以使用for ((i=0;i<10;i++)); do echo $i; done
并且工作正常,那么为什么我不能将其用作while ((i=0;i<10;i++)); do echo $i; done
?两者的执行周期有何不同?
答案 0 :(得分:95)
语法是令牌级别的,因此美元符号的含义取决于它所在的令牌。表达式$(command)
是`command`
的现代同义词,代表命令替换;这意味着,运行command
并将其输出放在此处。所以
echo "Today is $(date). A fine day."
将运行date
命令并将其输出包含在echo
的参数中。括号与在子shell中运行命令的语法无关,尽管它们有一些共同点(命令替换也在单独的子shell中运行)。
相比之下,${variable}
只是一种消歧机制,所以你可以说${var}text
,你的意思是变量var
的内容,然后是text
(如与$vartext
相对,这意味着变量vartext
)的内容。
while
循环需要一个应该评估为true或false的参数(或者实际上是多个,其中检查最后一个的真值 - 感谢Jonathan Leffler指出这一点);当它为假时,循环不再执行。 for
循环遍历项列表并依次将每个项绑定到循环变量;你引用的语法是一种 - 相当概括 - 表示一系列算术值的循环的方法。
这样的for
循环可以被重新定义为while
循环。表达式
for ((init; check; step)); do
body
done
相当于
init
while check; do
body
step
done
将所有循环控制保持在一个位置以便易读;但正如你所知,当它表达时,for
循环比while
循环要多得多。
当然,这种语法是特定于Bash的;经典的Bourne shell只有
for variable in token1 token2 ...; do
(更优雅的是,只要您确定您的参数字符串不包含任何echo
格式代码,您就可以避免第一个示例中的%
:
date +'Today is %c. A fine day.'
尽管在这个孤立的例子中没有产生很大的不同,但是避免一个可以学习的过程是一个重要的学习考虑因素。)
答案 1 :(得分:39)
$()
表示:“首先对此进行评估,然后评估其余部分”。
前:
echo $(pwd)/myFile.txt
将被解释为
echo /my/path/myFile.txt
另一方面,${}
扩展变量。
例如:
MY_VAR=toto
echo ${MY_VAR}/myFile.txt
将被解释为
echo toto/myFile.txt
为什么我不能将其用作
bash$ while ((i=0;i<10;i++)); do echo $i; done
我担心答案只是while
的bash语法与for
的语法不同。
答案 2 :(得分:-2)
你的理解是正确的。有关{}的详细信息,请参阅bash ref - parameter expansion
'for'和'while'具有不同的语法,并为迭代提供不同风格的程序员控制。大多数非asm语言提供类似的语法。
有一段时间,您可能会写i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done
本质上自己管理有关迭代的所有内容