凡科网免费建站官网,wordpress模板错位,新手做啥网站好,高密市住房和城乡建设局网站以下内容源于C语言中文网的学习与整理#xff0c;如有侵权#xff0c;请告知删除。
一、退出状态
#xff08;1#xff09;不管是 Bash 内置命令#xff0c;还是外部的 Linux 命令#xff0c;还是自定义的 Shell 函数#xff0c;当它运行结束或者退出时#xff0c;都…以下内容源于C语言中文网的学习与整理如有侵权请告知删除。
一、退出状态
1不管是 Bash 内置命令还是外部的 Linux 命令还是自定义的 Shell 函数当它运行结束或者退出时都会返回一个比较小的整数值给调用它的程序这个整数值就表示命令的退出状态。
很多 Linux 命令其实就是一个C语言程序熟悉C语言的读者都知道main() 函数的最后都有一个return 0如果程序想在中间退出还可以使用exit 0这其实就是C语言程序的退出状态。当有其它程序调用这个程序时就可以捕获这个退出状态。
2在 Shell 中有多种方式取得命令的退出状态其中 $?是最常见的一种。
xjhubuntu:~/iot/tmp$ cat test.sh
#!/bin/bashread a
read b(( $a $b ));echo 退出状态$?
xjhubuntu:~/iot/tmp$ ./test.sh
33
33
退出状态0
xjhubuntu:~/iot/tmp$ ./test.sh
23
45
退出状态1
xjhubuntu:~/iot/tmp$
3if 语句的判断条件从本质上讲判断的就是命令的退出状态。注意Shell中退出状态为 0 表示“成功”、“真”即程序执行完成并且没有遇到任何问题除 0 以外的其它任何退出状态都为“失败”、“假”。注意这正好与C语言的规定相反在C语言中0 表示“假”其它值表示“真”。
如果shell中一个命令比如判断大小成立则其返回值为0而shell中的if也是命令返回值为0时才成立这样一来我们就可以只根据命令比如大小关系是否正确来判断if是否执行了所谓“负负得正”不用再绕弯子先去判断命令的返回值然后再根据if只在返回值为0时才成立。比如下面代码中直接看 $a是否等于$b即可。
xjhubuntu:~/iot/tmp$ cat test.sh
#!/bin/bashread a
read bif (( $a $b )) # a33b33时由上面可知(( $a $b ))退出的状态为0表示成功、真 # 此时if根据退出的状态为真then后面的内容得以执行# 或者直接看 $a是否等于$b即可。
thenecho a和b相等
fi
xjhubuntu:~/iot/tmp$ ./test.sh
33
33
a和b相等
xjhubuntu:~/iot/tmp$ 二、退出状态和逻辑运算符的组合
1在if语句中我们可以使用逻辑运算符将多个退出状态组合起来一次判断多个条件。
Shell 逻辑运算符运算符使用格式说明if expression1 expression2逻辑与运算符当 expression1 和 expression2 同时成立时整个表达式才成立。 如果检测到 expression1 的退出状态为1表示失败就不会再检测 expression2 了因为不管 expression2 的退出状态是什么整个表达式必然都是不成立的检测了也是多此一举。||if expression1 || expression2逻辑或运算符expression1 和 expression2 两个表达式中只要有一个成立整个表达式就成立。 如果检测到 expression1 的退出状态为 0表示成功就不会再检测 expression2 了因为不管 expression2 的退出状态是什么整个表达式必然都是成立的检测了也是多此一举。!if !expression逻辑非运算符相当于“取反”的效果。如果 expression 成立那么整个表达式就不成立如果 expression 不成立那么整个表达式就成立。
2举例将用户输入的 URL 写入到文件中。下面代码中test 是 Shell 内置命令可以对文件或者字符串进行检测其中-w选项用来检测文件是否存在并且可写-n选项用来检测字符串是否非空。表示重定向默认情况下echo 向控制台输出这里我们将输出结果重定向到文件。
xjhubuntu:~/iot/tmp$ cat test.sh
#!/bin/bashread filename
read urlif test -w $filename test -n $url
thenecho $url $filenameecho 写入成功
elseecho 写入失败
fi
xjhubuntu:~/iot/tmp$ ./test.sh
test.txt
http://www.baidu.com.cn
写入失败
xjhubuntu:~/iot/tmp$ touch test.txt
xjhubuntu:~/iot/tmp$ ls
test1.sh test2.sh test.sh test.txt
xjhubuntu:~/iot/tmp$ ./test.sh
test.txt
http://www.baidu.com.cn
写入成功
xjhubuntu:~/iot/tmp$
xjhubuntu:~/iot/tmp$ test -w test.txt
xjhubuntu:~/iot/tmp$ echo $?
0
xjhubuntu:~/iot/tmp$ test -w test.c
xjhubuntu:~/iot/tmp$ echo $?
1
xjhubuntu:~/iot/tmp$