3

我正在尝试将字符串拆分为单个字符。例如temp="hello"进入"h", "e", "l", "l", "o"

我尝试使用 IFS,因为这是我在之前的字符串拆分中使用的,并且希望保持整个脚本的一致性。 IFS='' read h e l l o <<<"$temp"不起作用。我究竟做错了什么?

4

2 回答 2

6

您可以使用fold

arr=($(fold -w1 <<< "$temp"))

核实:

declare -p arr
declare -a arr='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'
于 2015-09-03T20:16:40.453 回答
1

TL; DR:这只是为了看看它是否可以完成。fold像 anubhava 建议的那样使用;启动单个进程需要付出很小的代价,以避免一次,而是两次使用eval.


我实际上不会使用它(我认为它是安全的,但我不会发誓,天哪,它丑吗!),但您可以使用eval、 大括号扩展和子字符串参数扩展来完成此操作。

$ temp=hello
$ arr=( $(eval echo $(eval echo \\\${temp:{0..${#temp}}:1})) )
$ printf '%s\n' "${arr[@]}"
h
e
l
l
o

这是如何运作的?非常细腻。首先,shell 扩展${#temp}为我们想要拆分其内容的变量的长度。接下来,innereval 将字符串\${temp:{0..5}:1}转换为一组字符串${temp:0:1},${temp:1:1}等。然后外部eval执行参数扩展,每个从 生成一个字母temp,这些字母提供数组的内容。

于 2015-09-04T14:32:55.100 回答