コマンドの終了ステータスを変数に抽出するにはどうすればよいですか?


14

私は数日前にBashを学び始めました。

次のgrepような変数に式の終了ステータスを取得しようとしています:

check=grep -ci 'text' file.sh

私が得た出力は

No command '-ic' found

パイプコマンドで行う必要がありますか?


6
終了ステータスについて$?は、コマンドが終了した直後に調べることができます。
coffeMug

パイプラインのコマンドの1つのステータスが必要な場合は、PIPESTATUS配列を調べることができます。
cas

回答:


26

あなたの命令、

check=grep -ci 'text' file.sh

シェルは「-ci引数textおよびfile.shでコマンドを実行し、変数checkgrepその環境の値に設定する」と解釈します。


シェルは、最後に実行されたコマンドの終了値を変数に保存します?。次のように、独自の変数の1つにその値を割り当てることができます。

grep -i 'PATTERN' file
check=$?

この値に基づいて動作する場合は、check変数を使用できます。

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

または、個別の変数の使用をスキップして、$?すべて一緒に検査する必要があります。

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(に注意し-qてください。grep何も出力せず、何かが一致するとすぐに終了するように指示します。ここで何が一致するかはあまり関心がありません)

または、パターンが見つからないときに「何かをする」だけの場合:

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

保存$?の値がとき、別の変数にあなたが後でそれを使用する必要がある場合にのみ、これまで必要とされている$?のように、上書きされています

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

上記のコードスニペットで$?は、[ "$err" -ne 0 ] && [ ! -d "$dir" ]テストの結果で上書きされます。ここに保存する必要があるのは、表示してで使用する必要がある場合のみexitです。


4

質問は明確ではありませんが、送信したコードに基づいてcheckgrepコマンドの終了ステータスを変数に保存したいようです。これを行う方法は、実行することです

grep -ci 'text' file.sh
check=$?

シェルからコマンドを実行する場合、その終了ステータスは特別なシェルパラメーターを通じて利用可能になります$?

これはPOSIX(Unixライクなオペレーティングシステムの標準)によってシェルの仕様に文書化されており、Bashの実装はSpecial Parametersの下に文書化されています。

あなたは新しい学習者なので、基本を習得するために良い本やオンラインチュートリアルから始めることを強くお勧めします。Stack Exchangeサイトでは外部リソースの推奨は推奨されていませんが、LhunathとGreyCatのBash Guideをお勧めします。


4

check=grepコマンドに渡す環境で変数を設定するようにbashに指示しました

-ci 'text' file.sh

しかし、ci存在しません。

あなたはそのコマンドをバックティックまたはドル記号が前に付いた括弧で囲むことを意図していたと思います。

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

今、$check任意のマッチがあったなし一致した場合、または正の場合は0でなければなりません。


1

出力をチェックするときに-cを使用する理由がわかりませんか?成功したかどうかではなく、何かが一致した回数をチェックするために使用されます。

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

しかし、この例では

check="$(grep --silent -i 'text' file.sh; echo $?)"

終了コード以外は何も出力せず、終了コードがエコーされます。これは、変数チェックが使用する出力です。また、私はそれが単一行であるため、それを好む。

--silentを-qに置き換えることができます。grepの出力に興味がないので、それが機能したかどうかだけに使用します。

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

grepコマンドの出力を変数に割り当てる正しい方法は、@ monty-harderが言及したとおりです。

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

このコマンドの終了ステータスを変数に割り当てるには$?、次のようにコマンドを実行した直後にシェルパラメーターを使用する必要があります。

grep -ci 'text' file.sh
check=$?
echo $check
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.