在构建和数组时在bash中修改IFS

时间:2019-01-10 13:39:40

标签: arrays bash ifs

我正在尝试使用自定义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确实更改为“;”之后但这并不会在数组创建中生效。

1 个答案:

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