以下所有这些选项都可以将i设置为计数。
count=5
for (( i=count; i>=0; i-- )); do
echo "$i"
done
for (( i=$count; i>=0; i-- )); do
echo "$i"
done
for (( i=$((count)); i>=0; i-- )); do
echo "$i"
done
for (( i=${count}; i>=0; i-- )); do
echo "$i"
done
哪个是正确的还是首选的?
答案 0 :(得分:5)
通常,在((...))
和$((...))
等算术上下文中,仅按名称引用变量,不带 $
前缀 (因为你的命令已经在变量$i
)中执行了:
for (( i=count; i>=0; i-- )); do
echo "$i"
done
由于((...))
本身就是算术上下文,因此没有充分的理由在其中使用单独的,扩展的算术上下文 - $((count))
。
请注意,$count
和${count}
是等效的,并且在count
和{
之后包含变量名称}
- {{1}只有必需才能消除变量名与后续字符的歧义,后续字符也可以合法地成为变量名的一部分(不适用于您的命令)。
正如Gordon Davisson指出的那样,有些人会选择始终使用$
表单以获得视觉清晰度。
虽然${var}
- 算术上下文中的前缀变量引用确实有效,但很少有理由使用它们:使用$
会在之前引入额外的扩展步骤算术评估,不仅是不必要的,而且可能导致不同的行为,如rici's helpful answer中所述。
仅需要 $
前缀的情况:
引用位置和特殊参数(变量) ,只能使用引用 $
:谢谢,rici。
$
,$1
,... $2
$#
,$?
,$$
(还有其他参数,但它们通常不是数字 - 请参阅第$!
章Special Parameters
)。 如果您需要非零默认值 ,则通过参数展开提供 ;例如,如果man bash
未设置或为空,则${count:-2}
默认为2
。
如果您想使用变量值作为运算符 而不是操作数;例如: -
$count
- 这不仅适用于op='*'; echo $(( 2 $op 2 ))
。
答案 1 :(得分:1)
There is a difference between using $x
and just x
in an arithmetic context:
x
causes the value of x
to be evaluated as a number. If x
hasn't been defined, the result is 0. If the value of x
is a valid arithmetic expression, that expression is evaluated. If it is an invalid expression, the result is a syntax error.
$x
causes the value of x
as a string to be interpolated into the arithmetic expression, which will then be evaluated.
This leads to different evaluations, particularly with uninitialized variables:
$ unset x
$ echo $((x/2))
0
$ echo $(($x/2))
bash: /2: syntax error: operand expected (error token is "/2")
# Also, with incomplete expressions
$ x=42+
$ echo $((x 7))
bash: 42+: syntax error: operand expected (error token is "+")
$ echo $(($x 7))
49
In both cases, I prefer the behaviour associated with the unadorned use of the variable name. Consequently, I recommend its consistent use in arithmetic expressions unless you have a really good reason not to (in which case, you probably should quote the expansion to make it clearer what your expectation is.)
答案 2 :(得分:-1)
我会避免使用$((count))
,因为这会产生不必要的算术评估步骤。其他语法有不同的语法,但语义完全相同。我会使用第一个,没有比它更短的原因。
我建议仍然等效(在其结果中),但更短:
for (( i=count+1; i-->1 ;)); do
echo "$i"
done
我一直很喜欢那个,因为它在视觉上说“我走向0”。