回答:
あなたの命令、
check=grep -ci 'text' file.sh
シェルは「-ci
引数text
およびfile.sh
でコマンドを実行し、変数check
をgrep
その環境の値に設定する」と解釈します。
シェルは、最後に実行されたコマンドの終了値を変数に保存します?
。次のように、独自の変数の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
です。
質問は明確ではありませんが、送信したコードに基づいてcheck
、grep
コマンドの終了ステータスを変数に保存したいようです。これを行う方法は、実行することです
grep -ci 'text' file.sh
check=$?
シェルからコマンドを実行する場合、その終了ステータスは特別なシェルパラメーターを通じて利用可能になります$?
。
これはPOSIX(Unixライクなオペレーティングシステムの標準)によってシェルの仕様に文書化されており、Bashの実装はSpecial Parametersの下に文書化されています。
あなたは新しい学習者なので、基本を習得するために良い本やオンラインチュートリアルから始めることを強くお勧めします。Stack Exchangeサイトでは外部リソースの推奨は推奨されていませんが、LhunathとGreyCatのBash Guideをお勧めします。
出力をチェックするときに-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
$?
は、コマンドが終了した直後に調べることができます。