我是 bash 的新手,我一直试图否定以下命令:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
如果我已连接到互联网,则此 if 条件返回 true。我希望它以相反的方式发生,但放在!
任何地方似乎都不起作用。
我是 bash 的新手,我一直试图否定以下命令:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
如果我已连接到互联网,则此 if 条件返回 true。我希望它以相反的方式发生,但放在!
任何地方似乎都不起作用。
你可以选择:
if [[ $? -ne 0 ]]; then # -ne: not equal
if ! [[ $? -eq 0 ]]; then # -eq: equal
if [[ ! $? -eq 0 ]]; then
!
分别反转以下表达式的返回。
更好的
if ! wget -q --spider --tries=10 --timeout=20 google.com
then
echo 'Sorry you are Offline'
exit 1
fi
如果你觉得懒惰,这里有一个在操作后使用||
(or) 和&&
(and) 处理条件的简洁方法:
wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
您可以使用不等比较-ne
代替-eq
:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
echo "Sorry you are Offline"
exit 1
fi
由于您正在比较数字,因此您可以使用算术表达式,它允许更简单地处理参数和比较:
wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
echo "Sorry you are Offline"
exit 1
fi
请注意-ne
,您可以只使用!=
. 在算术上下文中,我们甚至不必预先$
添加参数,即
var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"
工作得很好。但是,这不适用于$?
特殊参数。
此外,由于(( ... ))
将非零值评估为真,即非零值的返回状态为 0,否则返回状态为 1,我们可以缩短为
if (( $? )); then
但这可能会让更多的人感到困惑,而不是节省的击键值。
该构造在 Bash 中可用,但POSIX shell 规范(( ... ))
不需要(尽管提到可能的扩展)。
$?
综上所述,在我看来,最好完全避免,就像Cole's answer和Steven's answer一样。