【问题标题】:Modify IFS in bash while building and array在构建和阵列时在bash中修改IFS
【发布时间】:2019-01-10 13:39:40
【问题描述】:

我正在尝试使用自定义 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 即可轻松构建该字符串。
  • 是的,我知道这很容易,只需添加一个“;”在 ${arr4[i]} 之后。但是我在那里有很多空格,我必须对字符串进行多次操作,然后将其拆分回我需要的部分
  • 这 4 个数组也是可变的,所以如果我得到额外的空间或其他字符,那么之后的所有操作都需要修改.. 基本上我需要相信数组分隔符不会改变。

标签: arrays bash ifs


【解决方案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 开始时未设置的罕见但可能的情况下失败。)

也就是说,如果您只想要;-delimited 字符串并且arr5 是一种到达那里的方法,只需直接构建字符串:

for i in ${!arr1[@]}; do
  s+="${arr1[i]} ${arr2[i]} ${arr3[i]} ${arr4[i]};"
done
s=${s%;}  # Remove the last extraneous semicolon

【讨论】:

  • 是的,我使用了 ${arr5[@]} 而不是 ${arr5[*]}。现在就像一个魅力。第二种方式在 ';" 之后有一个额外的空间,我不得不改变 "; " 到 ";" 。现在我对 IFS 有了更好的理解。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2013-10-25
相关资源
最近更新 更多