如何通过' read'将字符串拆分为数组?用bash中的IFS字分隔符生成额外的空格元素?

时间:2016-10-13 03:32:44

标签: arrays bash ifs

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

如何摆脱数组中的额外空格元素?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我只想用sed替换分隔符

请参阅,重复使用您的脚本+ sed

Microsoft.Web.Services2.WebServicesClientProtocol

但我想我会完全不同地做到这一点

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

希望这会有所帮助

答案 2 :(得分:1)

您可以将分隔符->转换为单个字符:

l="2->4->3"

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

printf '%s' "${la[@]}"

如果存在字符串可能包含其他-的风险,则使用字符串中不可能出现的字符:

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