-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选项,shell 将在该行之后立即退出,因此您永远不会到达代码的该部分。

答案2

所有 bash 命令行开关都记录在man bash.

      -e 如果管道(可能包含
              单个简单命令),包含在中的子 shell 命令
              括号,或作为一部分执行的命令之一
              用大括号括起来的命令列表(参见 SHELL GRAMMAR
              上述)以非零状态退出。外壳没有
              如果失败的命令是命令的一部分,则退出
              列出紧随 while 或 Until 关键字之后的列表,
              if 或 elif 后的测试部分保留
              单词,在 && 或 || 中执行的任何命令的一部分列表
              除了最后的 && 或 || 之后的命令之外,任何
              管道中的最后一个命令,或者如果该命令是
              返回值与 ! 反转。 ERR 上的陷阱,
              如果设置,则在 shell 退出之前执行。这个选项
              适用于 shell 环境和每个子 shell 环境
              单独的环境(参见命令执行环境
              上面),并且可能导致子 shell 在执行之前退出
              子 shell 中的所有命令。

答案3

您的脚本不正确,因为

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

退出状态 0 - 意思是 - 一切正常,在 grep 的情况下意思是“好的,找到了字符串”。 exit status != 0 表示出现问题,对于 grep 1 表示“未找到”,2 表示“无法打开输入”...

相关内容