Bash:如何在不更改变量的情况下更改包含变量的数组中的值

时间:2018-10-21 02:02:05

标签: bash syntax

#!/bin/bash
c21=Apples
c31=Oranges
c41=Pears
movelist=(c21 c31 c41)
for movecheck in ${!movelist[@]} ; do
  eval "declare movecontents=$"${movelist[$movecheck]}""
  if [ "$movecontents" != "Oranges" ] ; then
  "${movelist[$movecheck]}"="" 
  fi
done
echo ${movelist[@]}

我在这里的目标是让第9行将数组中的a /值设置为null并将其从数组中删除,因此将=""删除。但是,按原样使用代码,因为${movelist[$movecheck]}会产生一个变量c*1,因此在将其声明为null时会吐出c41= command not found。我尝试使用eval并声明:eval "declare "${movelist[$movecheck]}"=''",但是这样做不是从数组中删除值,而是更改了实际变量。因此,上面示例代码的结果应该是movelist数组的末尾包含(c21 c41)。干杯。

1 个答案:

答案 0 :(得分:1)

使用unset删除数组元素:

$ a=(a b c d)
$ declare -p a
declare -a a=([0]="a" [1]="b" [2]="c" [3]="d")
$ unset a[2]
$ declare -p a
declare -a a=([0]="a" [1]="b" [3]="d")

所以:unset movelist[$movecheck]是您想要的。