首页 > 解决方案 > Bash:如何在不更改变量的情况下更改包含变量的数组中的值

问题描述

#!/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 行将数组中的值设置为 null / 将其从数组中删除,因此="". 但是,由于代码原样,因为${movelist[$movecheck]}结果是一个变量,c*1,当将其声明为 null 时,它会吐出c41= command not found。我尝试使用 eval & declare: eval "declare "${movelist[$movecheck]}"=''",但是这样一来,它并没有从数组中删除值,而是更改了实际变量。所以上面示例代码的结果应该在最后movelist包含数组(c21 c41)。干杯。

标签: bashsyntax

解决方案


用于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]是你想要的。


推荐阅读