我有一个 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 个问题。
该-e标志指示脚本在出错时退出。更多旗帜
如果出现错误,它将立即退出。
在$?为最后一个命令的退出状态。在 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中的所有命令。