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


32

次のbashスクリプトがあります。

#!/bin/bash -e

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

このスクリプトは、-eなしでは実行されません。-eこのスクリプトでは何ができますか?また、$?このコンテキストでは何をしますか?


1
奇数。-eマニュアルページにはありません(これに答えるアドレスを見たいです)。$?最後の終了コード(egrep上記で生成されたプロセスの終了コード)が含まれます。

2
@pst:はに-e文書化されていsetます。
グレッグヒューギル

これを行うことにより、スクリプトを簡素化できますif egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
。– bollovan

2
ifとの間にスペースがありません[。このスクリプトは動作しません -eあればあるため、grep下その後、何も見つからない-eスクリプトがすぐそこに終了します。がなければ-e、メッセージが逆方向に表示されます。ステータス($?)が0の場合、grepがユーザーを見つけたことを意味します。ちなみに、これは `grep '^ username:'である必要があります(より長い名前の別のユーザーがいる場合はどうなりますか?)。
ジル「SO-悪であるのをやめる」

3
ウィル#/bin/bash -eと同じ効果を持つ#/bin/bashライン#1にし、set -eライン#2に?
14年

回答:


34

エラー終了。その他のフラグ

エラーがある場合、すぐに終了します。

$?過去のコマンドの終了ステータスです。Linuxでは、終了ステータス0はコマンドが成功したことを意味します。その他のステータスは、エラーが発生したことを意味します。

egrep "^ username" / etc / passwd> / dev / null / etc / passwdファイルでユーザー名を検索します。見つかった場合、終了ステータスは$?0に等しくなります。見つからない場合、終了ステータスは(0ではなく)他の何かになるため、「エコーは存在しません」。


さらに、最初の2行をに置き換えることにより、-eなしでスクリプトを正しく動作させることができますif egrep "^username" /etc/passwd >/dev/null

1
なぜset必要ないのですか?:-/

1
@pst:-eは、コマンドライン引数としてbashに指定されているためです。下にリストされてsetいるオプションはすべて、bashのコマンドラインでも受け入れられます。マニュアルページのセクションオプションの最初の文に注意してください。
-grawity

14

すべてのbashコマンドラインスイッチはに記載されていman bashます。

      -eパイプライン(
              単一の単純なコマンド)、サブシェルコマンド
              括弧、またはの一部として実行されるコマンドの1つ
              中括弧で囲まれたコマンドリスト(SHELL GRAMMARを参照
              上記)ゼロ以外のステータスで終了します。シェルは
              失敗したコマンドがコマンドの一部である場合は終了します
              whileまたはuntilキーワードの直後のリスト、
              ifまたはelif予約に続くテストの一部
              単語、&&または||で実行されるコマンドの一部 リスト
              最後の&&または||に続くコマンドを除く
              パイプライン内の最後のコマンド、またはコマンドの
              戻り値は!で反転されています。ERRのトラップ、
              設定されている場合、シェルが終了する前に実行されます。このオプション
              シェル環境と各サブシェル環境に適用されます
              個別に(コマンド実行環境を参照)
              上記)、および実行する前にサブシェルが終了する可能性があります
              サブシェル内のすべてのコマンド。

2
ああ。私は男でそれを探しましたが、ファイルテストで-eを見つけた後、私はあきらめた主な引数の下で-eを見つけませんでした。素晴らしい抜粋。なぜset必要ないのですか?:-/

1

あなたのスクリプトは間違っています、なぜなら

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

終了ステータス0-平均-すべてはOKです。grepの場合は「OK、文字列が見つかりました」を意味します。終了ステータス!= 0は何かが間違っていることを意味します。grepの場合は1は「見つかりません」、2は「入力を開けません」という意味です...

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