【问题标题】:How does splitting string to array by 'read' with IFS word separator in bash generated extra space element?如何在bash中使用IFS单词分隔符通过“读取”将字符串拆分为数组生成额外的空格元素?
【发布时间】:2017-02-22 00:55:30
【问题描述】:

IFS 只有一个字符,它工作正常:

shell@kernel: ~> l="2.4.3"; IFS="." read -a la <<< "$l"; for ((i = 0; i < ${#la[@]}; ++i)) do echo ${la[$i]}; done;
2
4
3

虽然 IFS 有两个字符,但生成了额外的空格元素

shell@kernel: ~> l="2->4->3"; IFS="->" read -a la <<< "$l"; for ((i = 0; i < ${#la[@]}; ++i)) do echo ${la[$i]}; done;
2

4

3
shell@kernel: ~> l="2..4..3"; IFS=".." read -a la <<< "$l"; for ((i = 0; i < ${#la[@]}; ++i)) do echo ${la[$i]}; done;
2

4

3

如何去掉数组中多余的空格元素?

【问题讨论】:

  • IFS="-&gt;" 指定"-""&gt;" 的字段分隔符。在$l 中的"-&gt;" 之间没有nothing,所以你得到一个空元素。
  • 换句话说,IFS 不是 a 字段分隔符。它是单字符字段分隔符的列表。

标签: arrays bash ifs


【解决方案1】:

从注释继续,您可以在将值存储到数组之前测试一个空元素,或者您可以在echo 时处理空值。坦率地说,后者更简单,例如

l="2->4->3"; IFS="->" read -a la <<< "$l"; \
for ((i = 0; i < ${#la[@]}; ++i)) do \
[ -n "${la[i]}" ] && echo ${la[$i]}; done

输出

2
4
3

【讨论】:

    【解决方案2】:

    我只会使用 sed 来替换分隔符

    看,重用你的脚本 + sed

    bash$ l="2->4->3"
    bash$ read -a la <<< "$(echo $l | sed 's/->/ /g')"
    bash$ for ((i = 0; i < ${#la[@]}; ++i)) do echo ${la[$i]}; done
    2
    4
    3
    

    但我认为我会完全不同

    bash$ l="2->4->3"
    bash$ for x in `echo $l | sed 's/->/ /g'`; do echo $x; done
    2
    4
    3
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      您可以将分隔符 -&gt; 转换为单个字符:

      l="2->4->3"
      
      IFS="-" read -a la <<< "${l//->/-}"
      
      printf '%s' "${la[@]}"
      

      如果字符串可能包含额外的-,则使用字符串中不太可能出现的字符:

      IFS="┵" read -a la <<< "${l//->/┵}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2013-09-09
        • 2015-08-28
        • 1970-01-01
        • 2012-01-30
        相关资源
        最近更新 更多