私はbashスクリプトを書いています。特定のコマンドとgrepを実行します。
pfiles $1 2> /dev/null | grep name # $1 Process Id
応答は次のようになります。
sockname: AF_INET6 ::ffff:10.10.50.28 port: 22
peername: AF_INET6 ::ffff:10.16.6.150 port: 12295
応答は行なし、1行、または2行です。
grepが行を返さない場合(grep戻りコード1)、スクリプトを中止します。行が1つある場合は、A()またはB()を呼び出します(行が1つ以上の場合)。出力が1〜2行の場合、grepの戻りコードは0です。
grepには戻り値(0または1)と出力があります。
どうすれば両方をキャッチできますか?私が次のことをするなら:
OUTPUT=$(pfiles $1 2> /dev/null | grep peername)
その後、OUTPUT変数は出力(文字列)を持ちます。また、grepを実行するためのブール値も必要です。
答え1
あなたはそれを使用することができます
output=$(grep -c 'name' inputfile)
変数にはoutput
数値0
または1
が含まれます2
。その後、if
ステートメントを使用してさまざまな操作を実行できます。
答え2
これは非常に簡単です。
OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
grep_return_code=$?
$(…)
コマンド置換を変数に割り当てると、から$?
コピーされます$(…)
。もちろん、$?
これを明示的に参照する必要はありません。
if OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名) それから #残りのスクリプト ︙ フィリピン諸島
または
もし!OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名) それから 出口 フィリピン諸島 #残りのスクリプト ︙
このアプローチは、次のような状況で役立ちます。出力このコマンドとその戻りコード(終了状態ともいう)は関係ありません。しかし、その場合はgrep
相関関係が高いです。つまり、出力が生成されると成功します。出力が生成されない場合は失敗します。それでは、単にテストしてみてはいかがでしょうか?出力 ?
OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名) if["$output"] それから #残りのスクリプト ︙ フィリピン諸島
または
OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名) もし[-ジ「$出力」] それから 出口 フィリピン諸島 #残りのスクリプト ︙
"$1"
PS:妥当な理由がなく、自分が何をしているのかわからない限り、常にシェル変数参照(例:)を引用する必要があります。
答え3
必要な結果が必要な場合は、他の回答に記載されているフラグをgrep
使用することはできません。-c
しかし、できることは2回実行することです。一度は-c
フラグを使用して一致の数を取得し、一度は-c
フラグなしで一致を確認します。ただし、これは入力ファイルのサイズによって非常に非効率的になる可能性があります。
次のことができます。
コンテンツ入力する:
The first line is foo
I have a drink at the bar
The third line is foo again
コンテンツスクリプト:
#!/usr/bin/env bash
countMatches(){
echo Searching for "${1}"
result=$(grep "${1}" input)
if [ "$?" -ne 0 ]; then
echo No match found
echo
exit 1
fi
if [ $(echo "${result}" | wc -l) -eq 1 ]; then
echo 1 match found:
echo "${result}"
echo
else
echo 2 matches found:
echo "${result}"
echo
fi
}
countMatches foo
countMatches bar
countMatches baz
呼び出すときの出力です。スクリプト:
Searching for foo
2 matches found:
The first line is foo
The third line is foo again
Searching for bar
1 match found:
I have a drink at the bar
Searching for baz
No match found
答え4
その出力を表示し続けている間に、いくつかのパイプ出力のテストでgrepを使用する方法を理解しようとしている間、この問題に直面しました。ファイルをgrepingするのではなくstdinを使用していることに注意してください。
私の具体的な例は次のとおりです。
./manage.py --dry-run makemigrations | grep "No changes detected"
当時のリターンコードは0(成功)でしたNo changes detected
。変更がある場合、戻りコードは1(失敗)です。ただし、grepが一致しないため、必要な変更は印刷されません。
私の解決策は次のとおりです
./manage.py --dry-run makemigrations | tee /dev/stderr | grep -q "No changes detected"
これは常に出力を印刷しますが、それでも正しいエラーコードが返されます。