2017-01-13 8 views
2

grepの出力を別のコマンドにパイプしてチェックしたいと思います。以前のquestionでは、PIPESTATUSが提案されましたが、今はすべての条件で完全に機能していないことがわかりました。 grep(一致または不一致)の出力が何であっても、PIPESTATUSは0を返します。パイプされたgrepの出力を確認する

スクリプトが

GF=`grep g09 $INP | cut -d ' ' -f2` 
if [ ${PIPESTATUS[0]} = 1 ]; then 

基本的に含まれ、入力ファイルのg09のための最初のコマンドを検索します。それが存在しない場合、パイパースタットは1でなければなりません。今、私はG09が含まれている入力ファイルのため、出力は0であり、それにはG09を持っていない入力のために、出力はまだ0

++ grep g09 tor.sh 
++ cut -d ' ' -f2 
+ GF=hashe.gjf 
+ '[' 0 = 1 ']' 

であることがわかり、bashスクリプトでset -xを訴え

および

なぜですか?どうすれば修正できますか? PIPESTATUS以外のソリューションはありますか?

+0

完全なコードを貼り付けてください。 – codeforester

+0

'set -x'の出力からわかるように、入力ファイル' tor.sh'です。 2つの異なるディレクトリに2つの 'tor.sh'があります。完全なコードは大きいかもしれませんが、私は投稿を更新します – mahmood

+1

バックティックは別のプロセスでコマンドを実行しています。これは環境変数があなたの呼び出しスクリプトで利用できなくなった理由です。 –

答えて

3

なぜですか?

コマンド置換はサブシェルで実行されます。サブシェルが終了すると、その状態の結果はPIPESTATUSとなり、サブシェル内のものが上書きされます。

どうすれば修正できますか?

サブシェル内のPIPESTATUSを確認してください。あなたのケースでは

$(grep g09 $INPUT | cut -f2 -d' '; [[ 1 == $PIPESTATUS[0] ]] && { ... }) 
+0

{...}には複数の行が含まれています。それが私が完全なコードを貼り付けなかった理由です(それは不要です)。簡単な方法はありませんか? – mahmood

2

cutを通じて抽出された値が空であるかどうか、あなたは、単にチェックすることができます。

if [[ -z $GF ]]; then 
+0

空を意味するか空でないことを意味しますか? – mahmood

+0

GFPが空である(設定されていないか、長さがゼロである)とき、 '[[-z $ GF]]'は 'grep's'の終了コードをチェックしていたという事実に基づいて、空をチェックします。 – codeforester

+1

本当は... PIPESTATUSよりも簡単な方法もOKです。 – mahmood

関連する問題