What does the -e do in a bash shebang?
Your post actually contains 2 questions.
The
-e
flag instructs the script to exit on error. More flagsIf there is an error it will exit right away.
The
$?
is the exit status of the last command. In Linux an exit status of0
means that the command was successful. Any other status would mean an error occurred.
To apply these answers to your script:
egrep "^username" /etc/passwd >/dev/null
would look for the username
in the /etc/passwd
file.
If it finds it then the exit status
$?
will be equal to0
.If it doesn't find it the exit status will be something else (not
0
). Here, you will want to execute theecho "doesn't exist"
part of the code.
Unfortunately there is an error in your script, and you would execute that code if the user exists - change the line to
if [ $? -ne 0 ]
to get the logic right.
However if the user doesn't exist, egrep
will return an error code, and due to the -e
option the shell will immediately exit after that line, so you would never reach that part of the code.
All the bash command line switches are documented in 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.