次の内容を含むbashスクリプトがあります。
#!/bin/bash -e
egrep "^username" /etc/passwd >/dev/null
if[ $? -eq 0 ]
then
echo "doesn't exist"
fi
-e がない場合、スクリプトは実行されません。-e
このスクリプトは何をしますか?また、$?
このような状況ではどうすればよいですか?
答え1
あなたの投稿には実際に2つの質問が含まれています。
この
-e
フラグは、エラーが発生したときにスクリプトを終了するように指示します。その他のフラグエラーが発生するとすぐに終了します。
$?
最後のコマンドの終了状態です。 Linuxでは、終了ステータスはコマンドが0
成功したことを示します。他の状態は、エラーが発生したことを意味します。
これらの答えをスクリプトに適用するには:
egrep "^username" /etc/passwd >/dev/null
username
ファイルから検索されます/etc/passwd
。
見つかった場合、終了ステータス
$?
はと同じです0
。見つからない場合、終了ステータスは別のステータス(ではない
0
)になります。ここでecho "doesn't exist"
コードの一部を実行する必要があります。
残念ながらスクリプトにエラーがあります。コードを実行します。ユーザーが存在する場合- 行を次に変更します。
if [ $? -ne 0 ]
正しいロジックを得るために。
しかし、ユーザーが存在しない場合はegrep
エラーコードが返され、この-e
オプションによりシェルはその行の直後に終了するため、コードの該当部分に到達できません。
答え2
すべてのbashコマンドラインスイッチはに文書化されていますman bash
。
-eパイプの場合(次を含めることができます) 単一の単純コマンド)、次に含まれるサブシェルコマンド 角かっこまたは次の一部として実行されるコマンドのいずれか 中括弧で囲まれたコマンドのリスト(SHELL GRAMMARを参照) 上)ゼロ以外の状態で終了します。シェルはそうではありません 失敗したコマンドがコマンドの一部である場合は終了します。 while または Until キーワードに続くリスト、 if または elif 以降のテスト部分は保持されます。 単語、&&、または||で実行されるコマンドのリストの一部 最後の&&または||を除くすべてのコマンド パイプラインの最後のコマンド、またはコマンドが次のような場合 戻り値は!に反転されます。 ERRの罠、 設定すると、シェルが終了する前に実行されます。このオプション シェル環境と各サブシェル環境に適用 別の環境(コマンド実行環境参照) 上記)実行前にサブシェルが終了することがあります。 サブシェルのすべてのコマンド。
答え3
スクリプトが正しくありません。
egrep "^username" /etc/passwd >/dev/null
if[ $? -eq 0 ]
then
#echo "doesn't exist" # WRONG
echo "the USER EXISTS"
fi
終了ステータス0 - 意味 - すべてが正常です。 grepの場合は「OK、文字列が見つかりました」を意味します。終了ステータス!= 0は何かが間違っていることを意味します。 grep 1は「見つかりません」を意味し、2は「入力を開けません」を意味します...