使用IFS将字符串拆分为bash中的单个字符

时间:2015-09-03 20:12:36

标签: string bash ifs

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

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

2 个答案:

答案 0 :(得分:5)

您可以使用fold

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

验证

declare -p arr
declare -a arr='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'

答案 1 :(得分:1)

TL; DR:这只是为了看看是否可以完成。像anubhava建议的那样使用fold;启动单个流程是一个很小的代价,以避免不是一个,但两个使用eval

我实际上并没有使用它(我认为它是安全的,但我不会发誓,而且男孩,这是丑陋的!),但是您可以使用eval,大括号扩展和子串参数扩展来完成此任务。

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

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