我想在bash中执行以下操作,例如说我有以下名称而不是创建三个单独的数组来保存LC1,LC2和LC3的内容我认为最好在bash中创建树结构或者有人可能有一个更简洁的解决方案 - 我需要在bash中这样做。
LC1
Test1
Test2
LC2
Test3
Test4
LC3
Test5
Test6
答案 0 :(得分:2)
您可以模拟多维结构。 例如,使用 bash4 ,您可以使用关联数组:
declare -A a=(
[LC1]="Test1 Test2"
[LC2]="Test3 Test4"
[LC3]="Test5 Test6"
)
for k in "${!a[@]}"; do
printf '%s\n' "$k"
set -- ${a["$k"]} # by default split on white space, tab and newline
# you can use another delimiter, if you wish
for e; do
printf '\t => %s\n' "$e"
done
done
代码产生:
4.1.10(4)-release$ for k in "${!a[@]}"; do
> printf '%s\n' "$k"
> set -- ${a["$k"]} # by default split on white space, tab and newline
> # you can use another delimiter, if you wish
> for e; do
> printf '\t => %s\n' "$e"
> done
> done
LC1
=> Test1
=> Test2
LC3
=> Test5
=> Test6
LC2
=> Test3
=> Test4
请记住set命令会重置您的位置参数。
答案 1 :(得分:0)
@killio,我发布了一个新答案,因为评论提供的格式有限。
您可以像这样修改数组:举个例子, 如果你想要加倍元素的最后一个字符:
#!/bin/bash
a=(
'LC1 Test1 Test2'
'LC2 Test3 Test4'
'LC3 Test5 Test6'
)
printf '\nthe array before:\n\n'
printf '%s\n' "${a[@]}"
for ((i=0; i < ${#a[@]}; i++)); do
k=${a[i]%% *} es=${a[i]#* }
set -- $es
for e; do
(( !c++ )) && es=$e${e#${e%?}} || es="$es $e${e#${e%?}}"
done
a[$i]="$k $es"; c=0
done
printf '\n\nthe array after:\n\n'
printf '%s\n' "${a[@]}"
$ ./s
the array before:
LC1 Test1 Test2
LC2 Test3 Test4
LC3 Test5 Test6
the array after:
LC1 Test11 Test22
LC2 Test33 Test44
LC3 Test55 Test66