我对 bash 中反引号的评估感到困惑。我以前见过这样的代码,这是有道理的:
RESULT=`whoami`
Run Code Online (Sandbox Code Playgroud)
这将whoami
命令的输出存储在RESULT
变量中,并确认反引号计算为其中的命令输出。但我也看到过如下代码:
if `wget google.com -T 2 -t 1 -o /dev/null`; then
echo "Internet ok"
fi
Run Code Online (Sandbox Code Playgroud)
这是通过尝试获取 google 主页来测试互联网连接(-t 1
一次尝试,-T 2
一次 2 秒超时,并重定向到,/dev/null
因为它实际上并不想要输出,而只是想看看它是否成功)。代码读起来好像作者期望反引号将评估为wget
命令的退出代码而不是输出。
但它确实有效。它打印Internet ok
是否可以连接到 google.com,如果我将 url 更改为一些不存在的无意义 url,它不满足 if 语句并且不打印任何内容。我不明白为什么这有效。
wget
使用有效和无效的 url独立运行命令在两种情况下都不会打印任何内容,只是退出代码有所不同。
我的结论是,if
后跟反引号有一个特殊的构造,它返回退出代码而不是输出。我错了吗?
不,反引号没有特殊含义,您甚至可以wget
在if
语句中没有它们的情况下运行命令。
if
始终评估所遵循命令的退出代码。
可以在此处找到更全面的概述。
编辑
反引号启动在子shell 中执行的命令替换并返回退出代码。if
只检查返回码,它不使用命令的输出。
要比较命令的输出,您可以使用[
,它必须用 关闭]
,这基本上是一个测试。测试可以是任何东西
man test
字符串比较
[ "hello" == "test" ]
Run Code Online (Sandbox Code Playgroud)整数测试
[ 2 -eq 3 ]
Run Code Online (Sandbox Code Playgroud)如果测试成功,您将获得退出代码 0 ( true ),否则不会返回 0 ( false ),这将再次由if
.
所以你有如下想法。
if [ "`wget google.com -T 2 -t 1 -o /dev/null`" == "" ]
then
echo "emptY"
fi
Run Code Online (Sandbox Code Playgroud)
但这没有多大意义,因为将输出重定向到/dev/null
您将始终从[ "
wget google.com -T 2 -t 1 -o /dev/null获得 true " == "" ]
。
另一方面,检查wget
命令的输出是否包含输出也没有用,忽略-o /dev/null
,因为即使在错误情况下,您也会得到输出,但返回码不同。