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
生成一个字母,这些字母提供了数组的内容。

Blank
IFS
是“不拆分”。@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