下面是一个简单的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
答案 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,那么正常的参数扩展会使它工作;如果你不把它放在那么这个与算术表达式相关的规则使它工作。最终结果是他们都工作,你可以选择!