別のスクリプトから配列を読み取りました。この配列は" "
一部のメンバーが空であるため、すべての配列メンバーの周囲。
in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
echo ${vector[index]}
done
問題は、各出力行の周りに引用があり、それらを取り除きたいということです。
"red"
"blue"
"green"
""
"white"
"black"
次のように変更する必要があります。
red
blue
green
white
black
awk
、tr
、sed
またはその他のパイプラインベースの方法を使用しないメソッドを探しています。かっこ、句読点の違いなど、ネイティブな方法で解決したいだけです。
これはうまくいくかもしれません:
in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
echo ${vector[index]//\"/}
done
readdata.sh
が余分な引用符なしで改行区切りデータを生成する場合は、プログラムをよりシンプルで堅牢にします。
現在のプログラムでは、readdata.sh
の出力は空白で分割され(つまり、"a b"
は2つの配列要素"a
とb"
になります)、結果の各Wordはワイルドカードパターン(たとえば、"a * b"
は"a
になり、次に現在のディレクトリ内のファイル名、最後にb"
になります)。詳細については、 シェルスクリプトが空白やその他の特殊文字でチョークするのはなぜですか? を参照してください。
Bashは、改行で区切られたデータを読み取る非常に簡単な方法を提供します: mapfile
組み込み。 bashはサブシェルでパイプラインの右側を実行するので、./readdata.sh 0 "$in_file" | mapfile -t vector
と書くだけではなく、変数をコマンドブロックで使用するか、プロセス置換を使用できます。
in_file=./data
mapfile -t vector < <(./readdata.sh 0 "$in_file")
for index in "${!vector[@]}"
do
echo "$index: ${vector[index]}"
done
インデックスのみを使用していない場合は、要素のみを使用して、配列を反復する最も簡単な方法は
for element in "${vector[@]}"
do
echo "$element"
done
あなたはワンライナーを好むので、
vector=("${vector[@]//\"/}")
テキスト置換は配列全体で機能する可能性があることを覚えておいてください。
「ハッキーな」検索と置換のソリューションを避けたい場合は、eval
を使用するとうまくいくようです。
vector=( $(eval echo ${vector[@]}) )
これにより、シェルはそれらをecho
への引用符付き引数として解釈し、引用符を削除します。もちろん、上の行はまだ空白の問題がありますが、ここで重要なのはeval
を使用するという考えです。