次のbashスクリプトがあります:
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
このスクリプトは-eなしで実行します。 -e
はこのスクリプトに対して何をしますか?また、このコンテキストで$?
は何をしますか?
コメント
回答
投稿には実際には2つの質問が含まれています。
-
-e
フラグは、エラー時に終了するようにスクリプトに指示します。 その他のフラグエラーが発生すると、すぐに終了します。
-
$?
は、最後のコマンドの終了ステータスです。 Linuxでは、終了ステータス0
は、コマンドが成功したことを意味します。その他のステータスは、エラーが発生したことを意味します。
これらの回答をスクリプトに適用するには:
egrep "^username" /etc/passwd >/dev/null
/etc/passwd
ファイルでusername
を探します。
-
見つかった場合その場合、終了ステータス
$?
は0
と等しくなります。 -
そうでない場合「終了ステータスが別のものになるとは思わない(
0
ではない)。ここでは、echo "doesn"t exist"
の部分を実行する必要があります。コード。
残念ながらスクリプトにエラーがあります。ユーザーが存在する場合は、そのコードを実行します-行を
ロジックを正しくするため。
ただし、ユーザーがそうでない場合は 「存在しません。egrep
はエラーcを返します。 ode、および-e
オプションにより、シェルはその行の直後に終了するため、コードのその部分に到達することはありません。
コメント
- さらに、最初の2行を
if egrep "^username" /etc/passwd >/dev/null
に置き換えることで、-eなしでスクリプトを正しく機能させることができます。 -
set
が必要ないのはなぜですか? :-/ - @pst:
-e
がコマンドライン引数としてbashに指定されているため。set
にリストされているすべてのオプションは、コマンドラインのbashでも受け入れられます。マニュアルのセクションオプションの最初の文に注意してください。ページ。
回答
すべてのbashコマンドラインスイッチはman bash
。
-e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command"s return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell.
コメント
- ああ。私は男性でそれを探しましたが、ファイルテストで-eを見つけ、主な引数の下で-eを見つけなかった後、私はあきらめました。素敵な抜粋。
set
が必要ないのはなぜですか? :-/
回答
スクリプトが正しくありません。
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は「入力を開くことができない」ことを意味します…
-e
はありません(これに対する回答アドレスを本当に確認したいです)。$?
には、最後の終了コード(上記で生成されたegrep
プロセスの終了コード)が含まれます。-e
はset
に記載されています。if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
と[
。このスクリプトは'は-e
では機能しません。grep
が'何も見つからない場合、-e
の下でスクリプトはそこで終了します。-e
がないと、'メッセージが逆になります:ステータス($?
) 0は、grepがユーザーを検出したことを意味します。ちなみに、これは `grep ' ^ username:'である必要があることに注意してください('より長い名前の別のユーザーですか?)#/bin/bash -e
は#/bin/bash
1行目とset -e
2行目?