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
如何摆脱数组中的额外空格元素?
答案 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//->/┵}"