これはあなたの質問には指定されていませんが、キーワードを含むファイルがあると思います。ファイルcmdfile
にはx-g301
が含まれています。そして、あなたのようなスクリプトを実行します。その場合は
./script "input_file" "output_file" < cmdfile
、第一のパターンを検索しながら最初のgrep
コマンドはstdin
の全体cmdfile
を消費し、そして何も二grep
放置されません。そのため、2番目のgrep
と2番目のスクリプトは出力を生成しません。
これを修正する方法はたくさんありますが、正しいものを選択するかどうかは、正確に何をしようとしているのかによって異なります。どうすればcmdfile
のように見えますか?
./script "input_file" "output_file" "cmdfile"
をそして、あなたのスクリプトは、このようにそれを扱うあります:それはちょうど、コマンドパターン以外のものとの大きなファイルだと仮定すると、あなたはこのように、スクリプトに3番目の引数としてそのファイルを渡すことができ
#!/bin/bash
input_file="$1"
output_file="$2"
cmdfile="$3"
if grep -q "X-G303" "$cmdfile"; then
awk -f ./mno/script.awk "$input_file" > t1.json
fi
if grep -q "x-g301" "$cmdfile"; then
sh ./mno/tm.sh "$input_file" > t2.json
fi
awk
とsh
スクリプトでは、入力ファイルの名前を指定しているので、grep
からの出力は実際には必要ないと仮定しています。
grep
を存在検索に使用する正しい方法は、終了コード(およびミュートされた出力は-q
)です。 if
の代わりにショートサーキット(grep ... && awk ...
)を使用していた可能性がありますが、この方法はおそらく読みやすくなります。
あなたの 'grep'コマンドはファイルに渡されないので、' grep'が 'stdin'を処理するので、これらのコマンドは無期限にブロックされます。また、 '|'は "or"コマンドではなく、左側のコマンドのouptutを右側のコマンドの入力に送るパイプです。実際に使用しているシェルを表示すると便利でしょう'bash'タグはおそらく良い手がかりですが、'(shell) 'の代わりに –
それに気付きました。私はそれを修正し、それは働いている! –