$@不是一个真正的数组 - 它是一个外壳“特殊参数”,你需要比其他数组更加小心。
您看到的行为的原因是 ${parameter:length:offset}语法的确切行为是特殊情况 when parameteris ,并且该行为与如果是一个真实数组时@您会得到的行为不一致。@
这是相关文档(我的粗体强调):
${参数:偏移:长度}
...如果参数是@,则结果是从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]}