“[ -n "$VARIABLE" ] || exit 0”的含义是什么?

6

我正在查看如何修复Debian中/etc/init.d/hostapd的问题。然而,我不知道这行代码是做什么的,也不知道它是如何工作的。

[ -n "$DAEMON_CONF" ] || exit 0

在网上搜寻bash教程时,我从未见过任何人这样做。
当我运行代码时,我的终端窗口关闭了(因为$DAEMON_CONF没有设置为任何值)。如果我改变代码为:
[ -n "not empty" ] || exit 0

我的控制台窗口无法关闭。

所以,-n被评估为true,与退出0进行或运算,结果是什么?


1
当某个进程返回错误信息时,一个技巧是使用“或真值”来消除错误。因此,|| whatever 表示无论如何都会执行 whatever,只有当双竖线符号左侧的结果为假时(在 shell 语言中表示失败的退出代码)才会执行。@ElliotFrisch 的措辞更好。 - Dilettant
2
https://en.wikipedia.org/wiki/Bash_(Unix_shell)#Conditional_execution - Marc B
@MarcB,感谢您提供文档链接! - Kearney Taaffe
4个回答

7

如果方括号中的表达式返回false,则执行或运算符(||)后面的操作(并且exit 0)。否则,它将短路,下一条语句将被评估。


4

[是命令test的替代名称。您可以通过查看test的man页面了解有关参数/标志等的信息:

man test

你会看到-n的效果:

-n STRING

          the length of STRING is nonzero
此外,|| 表示或者。因此,如果 test 命令返回 False,则会执行 || 后面的内容。如果 test 返回 true,则不会执行该命令。
你的命令可以这样表述:“如果变量 $DAEMON_CONF 没有值,则以返回代码 0 的方式退出”。
长版本可能是这样的:
if test ! -n "$DAEMON_CONF"; then
    exit 0
fi

3
[ -n "$DAEMON_CONF" ] || exit 0

这是一个不必要的双重否定。以下内容可以达到同样的效果:

[ -z "$DAEMON_CONF" ] && exit 0

或者可以不使用任何标志来完成:

[ "$DAEMON_CONF" ] || exit 0

0

它检查环境变量是否已定义,如果$DAEMON_CONF不存在,则将以0代码退出,更好的代码是。

[ -n“$DAEMON_CONF”] || echo“因为未设置DAEMON_CONF而退出”&& exit 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接