考虑以下 bash 代码:
i=1
while [ $i -le 50 ]
do
echo $i
i=$(($i+1)) # <-------
done
在尖线中,为什么使用多少个括号很重要?如果我这样写,代码就不起作用
i=$($i+1)
为什么会这样呢?
答案1
当然,这是完全不同的。我们专注于巴什仅内置:
$((...))
是算术替换。完成算术运算后,整个内容将被表达式的值替换。看http://mywiki.wooledge.org/ArithmeticExpression
((...))
是一个算术命令,如果表达式非零,则返回退出状态 0;如果表达式为零,则返回 1。如果需要副作用(分配),也用作“let”的同义词。看http://mywiki.wooledge.org/ArithmeticExpression
命令替换:"$(cmd "foo bar")"
导致命令“cmd”使用参数“foo bar”执行,并将"$(..)"
被输出替换。看http://mywiki.wooledge.org/BashFAQ/002和http://mywiki.wooledge.org/CommandSubstitution
最后
您可以编写比以下更好/更简单的行i=$(($i+1))
:
((i++))
对于loop
:
for i in {1..50}; do ...
或者
for ((i=1; i<50; i++)); do ...