【问题标题】:Concatenate strings in Bash to call an array in a For loop [duplicate]在 Bash 中连接字符串以在 For 循环中调用数组 [重复]
【发布时间】:2023-02-10 01:21:30
【问题描述】:

我希望在 bash 中嵌套几个 For 循环以首先检查一个数组,然后基于该数组检查第二个数组。

#!/bin/sh

domArr=( "ABC" "DEF" "GHI" )
ABCarr=( "1" "2" "3" )
DEFarr=( "4" "5" "6" )
GHIarr=( "7" "8" "9" )

for domain in "${domArr[@]}"
do
    # This should be 'domain = "ABC"'
    for group in "${domain+arr[@]}"
    do
        # This should be 'group = "1"'
    done
done

【问题讨论】:

  • 做出选择:shebang #! 应该是 #!/bin/bash 或删除 sh
  • 你想要的是一个间接引用.使用名称变量。也就是说,此代码将永远无法与 POSIX 标准 /bin/sh 一起使用,它根本不支持数组。正如吉尔斯所说,你的 shebang 应该明确地启动具有所需功能的 shell。
  • 有关间接引用的一般参考,请参阅BashFAQ #6。在目前的情况下,您希望declare -n 设置一个名称变量(declare -n curDomArr="${domain}arr",而unset -n curDomArr 将其拆除。

标签: bash shell for-loop variables


【解决方案1】:

你可以像这样使用它:

domArr=( "ABC" "DEF" "GHI" )
ABCarr=( "1" "2" "3" )
DEFarr=( "4" "5" "6" )
GHIarr=( "7" "8" "9" )

for domain in "${domArr[@]}"
do
    echo "iterating array ${domain}arr ..."
    a="${domain}arr[@]"
    for group in "${!a}"
    do
        echo "$group"
    done
done

输出:

iterating array ABCarr ...
1
2
3
iterating array DEFarr ...
4
5
6
iterating array GHIarr ...
7
8
9

【讨论】:

    【解决方案2】:

    简单地:

    #!/bin/bash
    
    dom=( "ABC" "DEF" "GHI" )
    ABC=( "1" "2" "3" )
    DEF=( "4" "5" "6" )
    GHI=( "7" "8" "9" )
    
    for ((i=0; i<${#dom[@]}; i++)); do
        # This should be 'domain = "ABC"' + "1"
        echo "${dom[i]} ${ABC[i]}"
    done
    

    输出

    ABC 1
    DEF 2
    GHI 3
    

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2017-01-30
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多