变量引用是否应该在循环算术(算术上下文)中为$ -prefixed?

时间:2017-04-09 21:17:41

标签: bash variables for-loop syntax

以下所有这些选项都可以将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

哪个是正确的还是首选的?

3 个答案:

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