What does the -e do in a bash shebang?

Your post actually contains 2 questions.

  1. The -e flag instructs the script to exit on error. More flags

    If there is an error it will exit right away.

  2. The $? is the exit status of the last command. In Linux an exit status of 0 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 to 0.

  • If it doesn't find it the exit status will be something else (not 0). Here, you will want to execute the echo "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.

Tags:

Linux

Bash