【问题标题】:Iterate over array of array names expanding each to its members迭代数组名称的数组,将每个名称扩展到其成员
【发布时间】:2020-08-11 02:03:12
【问题描述】:

我想创建一个由字符串组成的子数组数组,并一次获取主数组中每个子数组的所有子数组值。

例如,我希望第一次打印出"str1" "str2",但实际上打印出的是"sub1"

#!/bin/bash
declare -a arr=(sub1 sub2)
declare -a sub1=("str1" "str2")
declare -a sub2=("str3" "str4")

for item in "${arr[@]}"; do
  echo $item
done 

我想要这种行为,以便以后可以调用脚本并将"str1" "str2" 传递给接受两个值的参数。然后我想用"str3" "str4"再次运行脚本

【问题讨论】:

    标签: bash


    【解决方案1】:

    为循环的控制变量(即item)设置nameref属性,这样它就可以在循环体中用作对其值指定的变量的引用。

    declare -n item
    for item in "${arr[@]}"; do
      echo "${item[@]}"
    done
    

    或者,作为Ivan suggested,您可以将[@] 附加到每个名称并在控制变量上使用间接扩展。

    for item in "${arr[@]/%/[@]}"; do
      echo "${!item}"
    done
    

    有关详细信息,请参阅:

    【讨论】:

      【解决方案2】:

      除了@oguzismail 建议的其他一些变体,首先:

      declare -a sub1=("str1" "str2")
      declare -a sub2=("str3" "str4")
      declare -a arr=("${sub1[*]}" "${sub2[*]}")
      
      for item in "${arr[@]}"; do
        echo $item
      done
      

      第二:

      declare -a arr=(sub1 sub2)
      declare -a sub1=("str1" "str2")
      declare -a sub2=("str3" "str4")
      
      for item in "${arr[@]}"; do
        name="$item[@]"
        echo "${!name}"
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 2014-02-21
        • 2018-01-04
        相关资源
        最近更新 更多