Shell脚本自增量计数作为数组索引

时间:2015-04-01 21:01:40

标签: bash shell

下面是一个简单的shell脚本代码,用于迭代收入文件并将该行保存到数组中。但#4行不应该像: cusips [$ i]而不是cusips [i]?或者没关系?似乎都奏效了。

谢谢, 约翰

 i=0  #line1
while read line # Read a line #line2
do #3
    cusips[i]=$line # Put it into the array #line4
    i=$(($i + 1)) #line5
done < $1 #line6

2 个答案:

答案 0 :(得分:0)

不同之处在于,在评估算术表达式之前,该值是否将被替换为

例如,这些都是相同的:

array=(1 1 2 3 5)
i=0
echo "${array[i]}"   # Look up the variable i
echo "${array[$i]}"  # Substitute the value of i: look up the value 0
echo "${array[0]}"   # Look up the value 0, just like above

但是,当您开始对变量而不是值进行操作时,它会有所不同:

echo "${array[i++]}"   # Increment variable i
echo "${array[$i++]}"  # 0++: syntax error: operand expected
echo "${array[0++]}"   # Makes no sense, just like above

由于您可以增加变量而不是数字(i++可以正常但0++不起作用),因此在使用$进行评估之前,不能将变量替换为其内容。

对于评估为算术表达式的所有其他语法(例如$((..)))也是如此。您可以使用(( i++ ))而不是(( $i++ ))替换您的。


请注意,如果使用关联数组,索引将被计算为字符串而不是算术表达式,因此${array[i]}会查找字母i,而${array[$i]}会查找号码0

答案 1 :(得分:0)

在几个不同的地方(例如here),我看到了这句话:

  

在表达式中,shell变量也可以通过名称引用,而不使用参数扩展语法。

在数组的方括号内,事物在算术表达式的上下文中被解释。根据上面的(有点简洁)句子,你不需要在这个上下文中使用“参数扩展语法”,我将其称为变量名前面的$ -sign。

如果你包含$ -sign,那么正常的参数扩展会使它工作;如果你不把它放在那么这个与算术表达式相关的规则使它工作。最终结果是他们都工作,你可以选择!