使用 IFS 将字符串拆分为 bash 中的单个字符
splitting a string into individual characters in bash using IFS
我正在尝试将字符串拆分为单个字符。
例如temp="hello"
变成"h", "e", "l", "l", "o"
我尝试使用 IFS,因为这是我在之前的字符串拆分中使用的,并且希望保持整个脚本的一致性。
IFS='' read h e l l o <<<"$temp"
不起作用。我做错了什么?
您可以使用 fold
:
arr=($(fold -w1 <<< "$temp"))
验证:
declare -p arr
declare -a arr='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'
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
每个字母一个,这些字母提供数组的内容。
我正在尝试将字符串拆分为单个字符。
例如temp="hello"
变成"h", "e", "l", "l", "o"
我尝试使用 IFS,因为这是我在之前的字符串拆分中使用的,并且希望保持整个脚本的一致性。
IFS='' read h e l l o <<<"$temp"
不起作用。我做错了什么?
您可以使用 fold
:
arr=($(fold -w1 <<< "$temp"))
验证:
declare -p arr
declare -a arr='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'
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
每个字母一个,这些字母提供数组的内容。