$@
不是一个真正的数组 - 它是一个外壳“特殊参数”,你需要比其他数组更加小心。
您看到的行为的原因是 ${parameter:length:offset}
语法的确切行为是特殊情况 when parameter
is ,并且该行为与如果是一个真实数组时@
您会得到的行为不一致。@
这是相关文档(我的粗体强调):
${
参数:
偏移:
长度}
...如果参数是@,则结果是从offset开始的长度 位置参数。如果parameter是 @,则结果是从offset开始的长度位置参数。...
位置参数是, $0
, $1
, $2
...,因此使用这种语法,它的行为就好像$@
包含脚本名称 ( $0
) 以及脚本的参数 ( $1
, $2
, ...)。这与"$@"
扩展至不一致"$1" "$2" ...
,但这就是生活。
您应该能够通过创建一个新数组而不是$@
直接使用来简化事情(并修复脚本),即
new_array=("$@")
for (( i = 0; i < ${#new_array}; i++ )); do
hash=$(md5 -q ${new_array[@]:$i:1})
modifiedNames[$i]=${new_array[@]:$i:1}$hash
done
echo ${modifiedNames[1]}