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