代码之家  ›  专栏  ›  技术社区  ›  gurghet

我在$var中怎么能在bash中工作,而不是在“$var[@]”中工作?

  •  2
  • gurghet  · 技术社区  · 7 年前

    如果我在我的机器上(使用bash 3、4和5)尝试以下命令:

    bash-5.0$ VAR=(1 2 3)
    bash-5.0$ for i in ${VAR}; do echo $i; done
    

    我只有一条线 1 .

    例如,如果我在zsh上做同样的操作,它会很好地写出三行渐进数字。

    但是在我们的一个生产服务器中,我发现了:

    bash -c "for i in ${MY_VAR}; do stuff with $i; done"
    

    通过检查日志,看起来它实际上是在正确地迭代!

    这怎么可能?它是我不知道的bash的特定版本吗?或者我应该设置一些标志?或者数组是以特定的方式填充的?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Charles Duffy    7 年前

    它“有效”,因为代码实际上根本没有使用数组。

    export MY_VAR='1 2 3'
    bash -c 'for i in ${MY_VAR}; do echo "Doing stuff with $i"; done'
    

    …不涉及任何数组; MY_VAR 是一个被分词然后全局展开的字符串。

    不要那样做, 曾经 ,即使您确实需要对分隔符分隔字符串中的项进行迭代。可靠的选择是使用 read -r -a my_array <<<"$MY_VAR" 将字符串读取到数组中,然后 for i in "${my_array[@]}"; do echo "Doing stuff with $i"; done 重复它。

        2
  •  1
  •   gniourf_gniourf    7 年前

    你应该写:

    var=(1 2 3)
    for i in "${var[@]}"; do
        do stuff with "$i"
    done
    

    你需要 [@] 如图所示。不要使用大写变量名。现在,关于它在生产服务器上工作的原因:可能是因为 MY_VAR 定义为 MY_VAR="1 2 3" (或类似的东西),即, 米亚瓦 不是数组(这很糟糕)。

        3
  •  0
  •   codeforester    7 年前

    似乎bash评估 $arr ${arr[0]} :

    arr=(1 2 3)
    echo $arr      # yields 1
    
    arr[0]=999
    echo $arr      # yields 999
    

    对于关联数组:

    declare -A h
    h=([one]=1 [two]=2)
    echo $h            # yields nothing
    
    h=([0]=1 [two]=2)
    echo $h            # yields 1
    

    正如其他人指出的,通过数组循环的正确方法是:

    for i in "${arr[@]}"; do ...