我有两个问题,希望有人能帮助我理解。
${}和 $()有什么区别? 我知道 () 意味着在单独的 shell 中运行命令,放置 $意味着传递 变量的值。有人能帮我理解 这个? 如果我说错了请纠正我
${}
$()
()
$
如果我们可以使用 for ((i=0;i<10;i++)); do echo $i; done,它工作得很好,那么为什么我不能使用它作为 while ((i=0;i<10;i++)); do echo $i; done?两者在执行周期上有什么不同?
for ((i=0;i<10;i++)); do echo $i; done
while ((i=0;i<10;i++)); do echo $i; done
你的理解是正确的。关于{}的详细信息见 Bash 参数扩展
For 和 while 有不同的语法,并为迭代提供不同的程序员控制风格。大多数非 asm 语言都提供了类似的语法。
使用 while,您可能会编写 i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done,本质上是自己管理关于迭代的所有事情
i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done
$()的意思是: “首先评估这个,然后评估线的其余部分”。
例如:
echo $(pwd)/myFile.txt
会被解释为
echo /my/path/myFile.txt
另一方面,${}展开一个变量。
MY_VAR=toto echo ${MY_VAR}/myFile.txt
echo toto/myFile.txt
Why can't I use it as bash$ while ((i=0;i<10;i++)); do echo $i; done
bash$ while ((i=0;i<10;i++)); do echo $i; done
I'm afraid the answer is just that the bash syntax for while just isn't the same as the syntax for for.
while
for
语法是令牌级别的,因此美元符号的含义取决于它所在的令牌。表达式 $(command)是代表指令替代的 `command`的现代同义词,意思是运行 command并将其输出放在这里。那么
$(command)
`command`
command
echo "Today is $(date). A fine day."
将运行 date命令并将其输出包含在 echo的参数中。括号与在子 shell 中运行命令的语法无关,尽管它们有一些共同之处(指令替代也在单独的子 shell 中运行)。
date
echo
相比之下,${variable}只是一个消除歧义的机制,所以当你指的是变量 var的内容时,你可以说 ${var}text,然后是 text(与 $vartext相反,$vartext指的是变量 vartext的内容)。
${variable}
var
${var}text
text
$vartext
vartext
while循环需要一个参数,它的值应该是 true 或 false (或者实际上是多个参数,其中检查了最后一个参数的 true 值——感谢 Jonathan Leffler 指出这一点) ; 当它为 false 时,循环不再执行。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.'
尽管在这个孤立的例子中,避免使用可以使用的流程并没有太大的不同,但这仍然是一个重要的考虑因素。)