元のコードと修正されたバージョン/コードレビューに基づいてこのスレッドに回答するには:
#ideally use variable names that do not exist as a command
hosts=()
FILENAME="/home/somethin/.hosts.conf"
ips=`cat $FILENAME | grep '322'`
for line in $ips; do
hosts+=("`echo $line | awk '{print $1}'`")
#alternative for shells not supporting the += operator:
#hosts=("${hosts[@]}" "`echo $line | awk '{print $1}'`")
done
echo ${hosts[@]}
指摘すべき問題がいくつかあります。スクリプトが「スタックしている」という印象を与えます。
- 毎回ホストを新たに割り当てています
hosts=$(`awk '{print $1}'`)
- 意図的であろうとなかろうと、逆を選択しています。つまり、 grep フラグと一致
-v
しません。
- コマンドを含まない入力で、ドルとバッククォート表記でネストされたコマンド置換を実行しています:
$(
awk '{print $1}' )
。
- awk には入力がありません
echo variablename
bash配列の最初の要素のみを出力します
注: と を使用して多くのことを実行できますawk
がsed
、どちらもより詳細な内容へのショートカットとして意図されていますが、後で拡張しやすい、より構造化された bash/shell スクリプトも意図されています。したがって、トレードオフがあり、最初の方法に問題はありません....