Cel*_*anu 1 arrays bash loops list
我想遍历bash中的一些列表。现在我有
array=("list1item1 list1item2" "list2item list2item2")
for list in "${array[@]}"
do
for item in $list
do
echo $item
done
done
Run Code Online (Sandbox Code Playgroud)
这行不通。有什么方法可以在bash中创建列表列表,数组数组或列表数组?
我想遍历list1,然后遍历list1中的listitems。然后遍历list2和list2中的列表项。
小智 7
缺乏声誉来评论 rici...
现在可以创建列表的列表,或多或少,并避免使用名称引用,如 rici 的答案(从 bash4.4 及以上),这要归功于数组引用扩展:@Q。例如:
declare -a list1=("one" "two three")
declare -a list2=("four five" "six")
declare -a listOfLists=("(${list1[*]@Q})" "(${list2[*]@Q})")
echo "${#listOfLists[@]}"
2
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,listOfLists 正确扩展为 2 个元素。现在好的事情是,多亏了 @Q,listOfLists 中的列表元素也将正确扩展为每个元素 2 个元素(而不是不使用 @Q 时的 3 个元素):
declare -a sameAsList1="${listOfLists[0]}"; declare -a sameAsList2="${listOfLists[1]}"
echo "${#sameAsList1[@]}" ; echo "${#sameAsList2[@]}"
2
2
declare -p sameAsList1 && declare -p list1
declare -a sameAsList1=([0]="one" [1]="two three")
declare -a list1=([0]="one" [1]="two three")
Run Code Online (Sandbox Code Playgroud)
我们终于得到了清单!
当我加入了失踪do,并done为您的代码:
array=("list1item1 list1item2" "list2item list2item2")
for list in "${array[@]}"
do
for item in $list
do
echo $item
done
done
Run Code Online (Sandbox Code Playgroud)
它产生了预期的输出:
list1item1
list1item2
list2item
list2item2
Run Code Online (Sandbox Code Playgroud)
我不清楚这与您的期望有何不同。
但是,这不是将列表嵌套到数组中的一种非常通用的方法,因为它取决于内部列表是由IFS分隔的。Bash不提供嵌套数组。数组严格来说是字符串数组,仅此而已。
您可以使用间接${!v}寻址()并将变量名称存储到外部数组中,尽管有点难看。以下是一个不太丑陋的变体,它依赖于namerefs。它将与合理的最新bash版本一起使用:
array=(list1 list2)
list1=("list 1 item 1" "list 1 item 2")
list2=("list 2 item 1" "list 2 item 2")
for name in "${array[@]}"; do
declare -n list=$name
for item in ${list[@]}; do
echo "$item"
done
done
Run Code Online (Sandbox Code Playgroud)
输出:
list 1 item 1
list 1 item 2
list 2 item 1
list 2 item 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2343 次 |
| 最近记录: |