文字列を個々の文字に分割しようとしています。たとえば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: これは、実行できるかどうかを確認するためのものです。fold
anubhava が示唆するように使用します。単一のプロセスを開始することは、1 回ではなく2 回のeval
.
私は実際にはこれを使用しません (安全だとは思いますが、誓うつもりはありません。少年、それは醜いです!) eval
。
$ temp=hello
$ arr=( $(eval echo $(eval echo \\\${temp:{0..${#temp}}:1})) )
$ printf '%s\n' "${arr[@]}"
h
e
l
l
o
これはどのように作動しますか?とても繊細。まず、シェルは${#temp}
、内容を分割したい変数の長さに展開します。次に、inner
eval は文字列\${temp:{0..5}:1}
を一連の文字列${temp:0:1}
、${temp:1:1}
などに変換します。次に、外側eval
は からそれぞれ 1 つの文字を生成するパラメーター展開を実行し、temp
それらの文字が配列の内容を提供します。