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

2 variables syntax bash for-loop

以下所有这些选项都可用于设置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
Run Code Online (Sandbox Code Playgroud)

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

mkl*_*nt0 5

一般情况下,在运算环境下,比如((...))$((...)),仅名称引用变量,$前缀(如你的命令已经相对于变量做$i):

for (( i=count; i>=0; i-- )); do 
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
  • 由于((...))算术上下文本身,没有充分的理由使用单独的,扩展的算术上下文$((count))- 在其中.

  • 需要注意的是$count${count}是等价的,并包围变量名称- count-中{}后,$需要从后面的字符也可以合法的变量名(不适用于你的命令)的一部分歧义的变量名.
    正如Gordon Davisson指出的那样,有些人选择总是使用${var}表格来保持视觉清晰度.

虽然$算术上下文中的前缀变量引用确实有效,但很少有理由使用它们:在算术评估之前使用$引入额外的扩展步骤,这不仅是不必要的,而且可能导致不同的行为,如rici的有用答案.

这里你只案件需要$前缀:

  • 引用位置特殊参数(变量)只能永远被引用 $:谢谢,罗杰斯国际商品指数.

    • 位置参数:$1,$2,...
    • 位置参数计数: $#
    • 特殊参数:$?,$$,$!(还有其他人,但他们不是一般的数字 -见章节Special Parametersman bash).
  • 如果您需要通过参数扩展提供非零默认值 ; 例如,${count:-2}默认为2if $count未设置或为空.

  • 如果要将变量值用作运算符而不是操作数; 例如:
    op='*'; echo $(( 2 $op 2 ))- 这不适合op.