bash:使用bash为结构添加名称值

时间:2011-05-18 14:14:40

标签: bash

我想在bash中执行以下操作,例如说我有以下名称而不是创建三个单独的数组来保存LC1,LC2和LC3的内容我认为最好在bash中创建树结构或者有人可能有一个更简洁的解决方案 - 我需要在bash中这样做。

 LC1
    Test1
    Test2
 LC2
    Test3
    Test4
 LC3
    Test5
    Test6

2 个答案:

答案 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