使用 bash 中的 IFS 单词分隔符按 'read' 将字符串拆分为数组如何生成额外的 space 元素?
How does splitting string to array by 'read' with IFS word separator in bash generated extra space element?
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 有两个字符,但会生成额外的 space 元素
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
如何删除数组中多余的 space 元素?
从评论继续,您可以在将值存储到数组中之前测试空元素,也可以在 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
我只会用 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
希望这对您有所帮助
您可以将分隔符 ->
转换为单个字符:
l="2->4->3"
IFS="-" read -a la <<< "${l//->/-}"
printf '%s' "${la[@]}"
如果存在字符串可能包含额外 -
的风险,则使用不太可能出现在字符串中的字符:
IFS="┵" read -a la <<< "${l//->/┵}"
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 有两个字符,但会生成额外的 space 元素
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
如何删除数组中多余的 space 元素?
从评论继续,您可以在将值存储到数组中之前测试空元素,也可以在 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
我只会用 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
希望这对您有所帮助
您可以将分隔符 ->
转换为单个字符:
l="2->4->3"
IFS="-" read -a la <<< "${l//->/-}"
printf '%s' "${la[@]}"
如果存在字符串可能包含额外 -
的风险,则使用不太可能出现在字符串中的字符:
IFS="┵" read -a la <<< "${l//->/┵}"