String 在bash中使用IFS将字符串拆分为单个字符
我正在尝试将字符串拆分为单个字符。 例如String 在bash中使用IFS将字符串拆分为单个字符,string,bash,ifs,String,Bash,Ifs,我正在尝试将字符串拆分为单个字符。 例如temp=“hello”进入“h”、“e”、“l”、“l”、“o” 我尝试使用IFS,因为我在前面的字符串拆分中使用了IFS,并且希望在整个脚本中保持一致性。 IFS=''read he l o您可以使用fold: arr=($(fold -w1 <<< "$temp")) TL;医生:这只是为了看看能不能做到。像阿努巴瓦建议的那样使用折叠;启动一个流程是一个很小的代价,它可以避免使用eval,而不是一次,而是两次 我实际上不会使用它
temp=“hello”
进入“h”、“e”、“l”、“l”、“o”
我尝试使用IFS,因为我在前面的字符串拆分中使用了IFS,并且希望在整个脚本中保持一致性。
IFS=''read he l o您可以使用fold
:
arr=($(fold -w1 <<< "$temp"))
TL;医生:这只是为了看看能不能做到。像阿努巴瓦建议的那样使用折叠;启动一个流程是一个很小的代价,它可以避免使用eval
,而不是一次,而是两次
我实际上不会使用它(我认为它是安全的,但我不会发誓,天哪,它难看吗!),但您可以使用eval
、大括号扩展和子字符串参数扩展来实现这一点
$ temp=hello
$ arr=( $(eval echo $(eval echo \\\${temp:{0..${#temp}}:1})) )
$ printf '%s\n' "${arr[@]}"
h
e
l
l
o
这是怎么回事?非常精致。首先,shell将${#temp}
扩展到要拆分其内容的变量的长度。接下来,internal
eval将字符串\${temp:{0..5}:1}
转换为一组字符串${temp:0:1}
,${temp:1:1}
,等等。外部eval
然后执行参数扩展,从temp
生成一个字母,这些字母提供了数组的内容。BlankIFS
是“不拆分”。@EtanReisner那么没有绝对的方法使用IFS进行空白拆分吗?我知道的IFS
没有“拆分每个字符”的技巧。不过,您可能可以在循环中读取-n1-rchar
。@EtanReisner好的,谢谢您,有没有办法对IFS执行相同的操作?没有IFS
基于单个字符的拆分。还有许多其他可用的技巧,如grep-o。
$ temp=hello
$ arr=( $(eval echo $(eval echo \\\${temp:{0..${#temp}}:1})) )
$ printf '%s\n' "${arr[@]}"
h
e
l
l
o