我有一个 bash 脚本,其中包含以下内容:
#!/bin/bash -e
egrep "^username" /etc/passwd >/dev/null
if[ $? -eq 0 ]
then
echo "doesn't exist"
fi
如果没有 -e,该脚本将不会运行。-e
这个脚本有什么作用?另外,$?
在这种情况下做什么?
答案1
您的帖子实际上包含 2 个问题。
该
-e
标志指示脚本在出错时退出。更多旗帜如果出现错误,它将立即退出。
这
$?
是最后一个命令的退出状态。在 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 表示“无法打开输入”...