有没有一种方法可以将字符串数组拆分为Bash中的多个其他数组?

时间:2019-10-31 14:16:18

标签: arrays linux string bash split

我在Bash中有一个数组my_array,其中包含这样格式化的字符串元素

my_array[0] = "username_1:id_1:name_1"
my_array[1] = "username_2:id_2:name_2"
my_array[2] = "username_3:id_3:name_3"

我很好奇是否有方便的方法可以迭代该数组,将其拆分为“:”字符并将值存储到三个单独的数组中。伪代码可能看起来像这样

index=0
for i in "${my_array}"
do
   usernames[$index], ids[$index], names[$index]= $(echo $i | tr ":" "\n")
   (( index = index + 1 ))
done

这个问题(How do I split a string on a delimiter in Bash?)与我要解决的问题非常相似,但是我试图将值存储到三个不同的数组中,这是我的主要障碍。在此先感谢您的帮助,因为我是bash编程的新手。

这是我尝试过的:


index=0
for i in "${arrayAdmin[@]}"
do
        credentials=$(echo $i | tr ":" "\n" )

        accounts[$index]=${credentials[0]}
        groups[$index]=${credentials[1]}
        names[$index]=${credentials[2]}
        (( index = $index + 1))
        echo $index
done

1 个答案:

答案 0 :(得分:1)

使用read,然后分别分配给每个数组。

for i in "${my_array[@]}"
do
   IFS=: read -r username id name <<< "$i"
   usernames+=("$username")
   ids+=("$id")
   names+=("$name")
done

你可以写

i=0
for rec in "${my_array[@]}"
do
    IFS=: read -r usernames[i] ids[i] names[i] <<< "$rec"
    ((i++))
done

但是我发现第一个循环更具可读性,因为它不需要为新数组指定显式循环索引。

或者对于输入数组和三个输出数组都使用相同的索引变量(由for循环管理)。

for ((i=0;i < ${#my_array[@]}; i++)); do
    IFS=: read -r usernames[i] ids[i] names[i] <<< "${my_array[i]}"
done

最后,如果您不想假设数组索引是连续序列,并且希望保留间隔

# For example, my_array=([0]="..." [5]="..." [10]="...")
for i in "${!my_array[@]}"; do
    IFS=: read -r usernames[i] ids[i] names[i] <<< "${my_array[i]}"
done
相关问题