-e 在 bash shebang 中做什么?

Chr*_*nry 49 linux bash

我有一个 bash 脚本,内容如下:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi
Run Code Online (Sandbox Code Playgroud)

如果没有 -e,此脚本将无法运行。什么是-e这个脚本呢?另外,$?在这种情况下做什么?

小智 47

您的帖子实际上包含 2 个问题。

  1. 该-e标志指示脚本在出错时退出。更多旗帜

    如果出现错误,它将立即退出。

  2. 在$?为最后一个命令的退出状态。在 Linux 中,退出状态为0表示命令成功。任何其他状态都意味着发生了错误。

要将这些答案应用于您的脚本:

egrep "^username" /etc/passwd >/dev/null
Run Code Online (Sandbox Code Playgroud)

将username在/etc/passwd文件中查找。

  • 如果找到它,则退出状态$?将等于0。

  • 如果它没有找到它,退出状态将是其他东西(不是0)。在这里,您将要执行echo "doesn't exist"部分代码。

不幸的是,您的脚本中有错误,如果用户存在,您将执行该代码- 将行更改为

if [ $? -ne 0 ]
Run Code Online (Sandbox Code Playgroud)

得到正确的逻辑。

但是,如果用户不存在,egrep将返回错误代码,并且由于该-e选项,shell 将在该行之后立即退出,因此您永远不会到达代码的那部分。


Gre*_*ill 17

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

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

  • 啊。我在 man 中寻找它,但是在文件测试中找到 -e 并且在主要参数下没有 -e 之后我放弃了。不错的摘录。为什么不需要`set`?:-/ (3认同)