我正在尝试使用自定义IFS在bash中从4个不同的数组中构建一个数组,请您帮忙。
#!/bin/bash
arr1=(1 2 3 4)
arr2=(1 2 3 4)
arr3=(1 2 3 4)
arr4=(1 2 3 4)
arr5=()
oldIFS=$IFS
IFS=\;
for i in ${!arr1[@]}; do
arr5+=($(echo ${arr1[i]} ${arr2[i]} ${arr3[i]} ${arr4[i]}))
done
IFS=$oldIFS
echo ${arr5[@]}
i输出是什么
1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4 4 4
但是它不起作用,输出是正常的''。
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 4
有什么想法吗?
我在不同的地方尝试过IFS: 1)在for循环中 2)在arr5()之前
我在for循环中测试了它,并且IFS确实更改为“;”之后但这并不会在数组创建中生效。
答案 0 :(得分:1)
IFS
用于扩展${arr5[*]}
,而不用于创建arr5
。
arr1=(1 2 3 4)
arr2=(1 2 3 4)
arr3=(1 2 3 4)
arr4=(1 2 3 4)
arr5=()
for i in ${!arr1[@]}; do
arr5+=("${arr1[i]}" "${arr2[i]}" "${arr3[i]}" "${arr4[i]}")
done
(IFS=";"; echo "${arr5[*]}")
在可能的情况下,只需在子shell中更改IFS
而不是尝试手动保存和恢复其值会更简单。 (您的尝试在极少数但可能未设置IFS
的情况下失败。)
也就是说,如果您只想使用;
分隔的字符串,而arr5
是到达那里的一种方法,则直接构建该字符串:
for i in ${!arr1[@]}; do
s+="${arr1[i]} ${arr2[i]} ${arr3[i]} ${arr4[i]};"
done
s=${s%;} # Remove the last extraneous semicolon