我卡在了尝试否定以下命令的过程中:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
如果我连接到互联网,此 if 条件将返回 true。我希望它相反,但是任何地方放置 !
似乎都不起作用。
我卡在了尝试否定以下命令的过程中:
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
!
反转下一个表达式的返回值。
test
命令: if test $? -ne 0; then
- Cyrusif
需要一个结果为 0 或者 1 的语句,所以你可以直接使用命令并将其反转:if ! wget ...; then ...; fi
。请注意,我的翻译旨在使原文更易理解,但不改变其意思。 - Nils Magnus更好
if ! wget -q --spider --tries=10 --timeout=20 google.com
then
echo 'Sorry you are Offline'
exit 1
fi
!
和下一个命令之间保留空格,否则将进行历史扩展操作。https://unix.stackexchange.com/questions/3747/understanding-the-exclamation-mark-in-bash - Roland如果你感到懒惰,这里有一种简洁的处理条件的方法,使用操作后的||
(或)和&&
(与):
wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
echo
命令后面的 &&
改为 ;
。原因是如果输出被重定向到满盘的文件上,echo
将返回失败,而 exit
永远不会触发。这可能不是你想要的行为。 - Score_Underset -e
,如果失败,echo
也会退出脚本。 - Jakub Bochenski-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
(( ... ))
结构是可用的,但不是POSIX shell规范所必需的(尽管被提及为可能的扩展)。$?
,如Cole's answer和Steven's answer。:)
- David C. Rankin
if ! [[ ...
有效。 - that other guy