【发布时间】:2017-08-27 02:30:53
【问题描述】:
我正在尝试更改作为参数数组 ("$@") 副本的数组中的值。假设我执行脚本如下:$ sh script.sh 1 2 3
这是脚本:
list="$@"
echo ${list[*]}
list[1]=4
echo ${list[*]}
预期输出:
1 2 3
1 4 3
我实际得到的:
1 2 3
1 2 3 4
知道是什么导致了这种行为,我该如何解决?
【问题讨论】:
我正在尝试更改作为参数数组 ("$@") 副本的数组中的值。假设我执行脚本如下:$ sh script.sh 1 2 3
这是脚本:
list="$@"
echo ${list[*]}
list[1]=4
echo ${list[*]}
预期输出:
1 2 3
1 4 3
我实际得到的:
1 2 3
1 2 3 4
知道是什么导致了这种行为,我该如何解决?
【问题讨论】:
list="$@" 将list 设置为普通变量,而不是数组。使用list=("$@") 将其存储为数组。顺便说一句,您通常应该使用 "${list[@]}" 来获取数组的元素,而不是 ${list[*]} 以避免出现元素中的空格、通配符扩展到匹配文件列表等问题。
一般来说,这是复制数组的正确方法:
copyarray=("${oldarray[@]}")
【讨论】:
刚刚找到this 的答案。命令行参数数组不是一个普通的数组,必须先转换为实际的数组,如下所示:
list=("$@")
【讨论】:
parens 中即可。