-eはbash shebangで何をしますか?

-eはbash shebangで何をしますか?

次の内容を含むbashスクリプトがあります。

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

-e がない場合、スクリプトは実行されません。-eこのスクリプトは何をしますか?また、$?このような状況ではどうすればよいですか?

答え1

あなたの投稿には実際に2つの質問が含まれています。

  1. この-eフラグは、エラーが発生したときにスクリプトを終了するように指示します。その他のフラグ

    エラーが発生するとすぐに終了します。

  2. $?最後のコマンドの終了状態です。 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は「入力を開けません」を意味します...

関連情報