0

私は現在、stdinから入力を受け取り、さらに処理するために入力を1行ずつ配列にロードするスクリプトに取り組んでいます。配列名を直接設定すると配列は正常に動作しますが、変数を配列名として使用しようとすると配列部分が正しく動作しません。コード自体は次のとおりです。

input=$(</dev/stdin)
# back up the field separator for later
OLDIFS=$IFS
# set the field separator to newline
IFS=$'\n'
# populate an array from that variable, as delimited by the IFS
lines=($input)

これは私が配列名を変数として設定するために試したものです

arrayname="something"
eval $arrayname=($input)

しかし、残念ながら、これを実行しようとすると、次のエラーが発生します。

./f.sh: line 53: syntax error near unexpected token `('
./f.sh: line 53: `                      eval $arrayname=($input)'

このすべてを言ったので、私は誰かがこれを正しく機能させるために私が何ができるか知っているだろうかと思っていましたか?ありがとう!

4

3 に答える 3

3

IFSあなたの場合は役に立たない(私は熱心なファンですが、必要な場合にのみ使用する傾向があります!)で遊ぶ代わりにIFS、ファイルを配列にロードするはるかに優れた効率的な方法があります。ちなみに、これはあまり知られていません。コマンドですmapfilehelp mapfile詳細については、bashを実行しているターミナルに入力してください)。

したがって、

mapfile lines

標準入力から読み取り、各行を配列に格納しlinesます。これにより、末尾の改行文字も格納されるため、トリミングする場合は、次の-tオプションを使用します。

mapfile -t lines

エントリごとに1行ずつ配列を出力するには、次を使用します。

printf '%s\n' "${lines[@]}"

(の引用を観察して"${lines[@]}"ください)。

eval使用は悪であることに注意してください!

主な問題は、変数を配列名として使用することです。bashには、他の言語でいわゆるポインターがありません。を使用しないevalと、変数に格納されている配列名を使用することは困難になります(ちょっとしたトリックを使用しない限り)。しかし、私がすでに言ったように、それevalは悪です。たぶん、あなたはあなたのデザインについて考えるのにもう少し時間を費やすべきです、おそらくあなたがしようとしていることを達成するための別の(より良い?)方法があります。

于 2012-11-30T21:54:20.057 に答える
1

間接参照を使用する:

men=(Jack John Joe)
women=(Zoe Zelda Zanna)
gender=women[@]
echo ${!gender}
于 2012-11-30T22:48:28.390 に答える
0
read -a arr
printf '%s\n' ${arr[@]}

それは解決策ですか?

于 2012-11-30T21:44:52.873 に答える