完成 bash 中的菜鸟。尝试编辑现有脚本。我在 Google 上搜索过“Bash 运算符”之类的东西,但找不到这个。
这是片段:
if [ "${activ_con}" -a ! "${activ_vpn}" ];
then
nmcli con up id "${VPN_CONNECTION_NAME}"
fi
我只想知道什么是“-a!” 位正在做。谢谢。(和往常一样,我可能会在接下来的几分钟内找到它……回到 GOogle!)
它的意思是“和”。
从测试手册页:
expression1 -a expression2
True if both expression1 and expression2 are true.
括号是 的同义词test
。
它 ( -a
) 是“与”运算符,-o
也是“或”运算符。
另一种方法是使用:
if [ -n "${activ_con}" ] && [ -z "${activ_vpn}" ]
then
nmcli con up if "${VPN_CONNECTION_NAME}"
fi
这显式测试了 的非零长度"${activ_con}"
和 的零长度"${active_vpn}"
。这更接近 Autoconf shell 样式规则推荐的样式(但它们根本不[
用于测试,因为方括号是元字符。一些旧的实现(可能在 1980 年代和 1990 年代初期)存在误解操作数的问题到test
命令,所以给出的建议避免使用-a
and-o
因为这些是导致混淆的选项。
POSIX 规范test
(and[
是 的同义词test
;在许多系统上,还有一个命令/bin/[
是指向 的链接/bin/test
,但 shell 通常使用 的内置实现test
)明确指定-a
用作连接含义“和” . test
(请注意POSIX 网站上页面的基本原理部分。)
条件表达式的 GNUbash
规范没有将其列为连接词,也根本没有列出。那很有意思。-a
-o
-a 和 -o 是所谓的复合语句。-a 与逻辑“&&”运算符相同,-o 与逻辑“||”相同 操作员。这是区别:
if [conditionA -o conditionB]
相比:
if [conditionA] || [conditionB]
-a 和 && 的情况相同。