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