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: これは、実行できるかどうかを確認するためのものです。foldanubhava が示唆するように使用します。単一のプロセスを開始することは、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}、内容を分割したい変数の長さに展開します。次に、innereval は文字列\${temp:{0..5}:1}を一連の文字列${temp:0:1}${temp:1:1}などに変換します。次に、外側evalは からそれぞれ 1 つの文字を生成するパラメーター展開を実行し、tempそれらの文字が配列の内容を提供します。

于 2015-09-04T14:32:55.100 に答える