次のようにテキストファイルから行を読み取る単純なbashスクリプトがあります。
#!/bin/bash
FILE=$1
while read line; do
...
done < $FILE
これはうまくいきますが、次のようにgrepを使用して最初にファイルを解析したいと思います。
INPUT_file=$(grep -E 'INPUT.*ACCEPT' $FILE)
この結果は INPUT_file 変数に割り当てられます。
今度は変数 "INPUT_file"から行を読みたいのですが、whileループに含めようとすると次のようになります。
while read line; do
....
done < $INPUT_file
次のエラーが発生します。
$INPUT_file: ambiguous redirect
答え1
使えばいいと思います。プロセスの交換変数の代わりに:
while read line; do
....
done < <(grep -E 'INPUT.*ACCEPT' $FILE)
(2<
文字に注意してください)これは、grep
変数に保存するために出力全体をメモリに一度にロードするのを防ぎます。このプロセスはループと並列に実行され、ループは各行がgrep
印刷されるとgrep
出力をread
入力(バッファリングされるまで)として処理します。
$(...)
これは、コマンド置換を使用し、全体の出力を維持するよりも高速で、メモリを使用しにくい傾向があります。また、Bash固有のスクリプトを書く場合、通常はコマンドを使用する目的が明確になるので、より良いスタイルです。
確かにこれは少し半パターンです。必要な処理のためにwhile read ...
Bashで処理するよりも通常のパイプを使用する方が良いかもしれませんが、2つのアプローチのうちの1つを使用する場合は有効です。
答え2
その時のここにある文字列役割を果たす:
while read line; do
...
done<<<$INPUT_file
答え3
grep
この場合は電話をしてはいけません。これはすべてシェルを使用して実行できます。例えば
while read -r line; do [[ $line =~ INPUT.*ACCEPT ]] && printf '%s\n' "$line"; done < your_iptables_file