在构建和阵列时修改 bash 中的 IFS

Modify IFS in bash while building and array

我正在尝试使用自定义 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[@]}

我的输出是什么:

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 确实更改为“;”之后但在创建数组时不生效

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