別のスクリプトから配列を読みました。" "
一部のメンバーが空であるため、配列はすべての配列メンバーを配置する必要があります。
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
答え1
これはうまくいくかもしれません:
in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
echo ${vector[index]//\"/}
done
答え2
readdata.sh
引用符を追加せずに改行で区切られたデータを生成すると、プログラムはより単純になり、強力になります。
現在のプログラムからの出力はreaddata.sh
空白に分割されます(たとえば、"a b"
結果は2つの配列要素となります"a
)b"
。各結果ワードはワイルドカードパターンとして解釈されます(たとえば、"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
答え3
裏地はシングルライニングを好むので、
vector=("${vector[@]//\"/}")
テキスト置換は配列全体に適用できることを覚えておいてください。
答え4
「ハッキングされた」検索および交換ソリューションを回避するには、eval
次の方法をお勧めします。
vector=( $(eval echo ${vector[@]}) )
これにより、シェルはそれを引用符付き引数として解釈して引用符をecho
削除します。もちろん、上記の行はまだ空白の問題がありますが、ここで重要なのはを使用することですeval
。