条件判断式
很多时候,我们都必须需要某些数据来判断程序该如何进行,简单的方式可以利用 &&
与 ||
,但如果我们还想要执行一堆指令呢?就可以用if then 来帮忙啦(当符合某个条件判断的时候,就予以进行某项工作),这个if ... then的判断还有多层次的情况,这里我们分别介绍来学习。条件判断式除了if ... then之外,还有case ... esac 这种形式,不过因为内容量太大,case ... esac我们放在下一篇文章里学习。
1.利用 if ... then
1.1 单层、简单条件判断式
- 语法结构:
单层、简单条件判断式
把上一篇Linux 之 shell script -- 善用判断式
提到的ans_yn.sh
代码改一改,就是一个简单的条件判断式 - 原本模样:
[ "${input}" == "Y" -o "${input}" == "y" ]
- 可以替换为
[ "${input}" == "Y" ] || [ "${input}" == "y" ]
- 把 ans_yn.sh 升级为 ans_yn_2.sh
vi ans_yn_2.sh
输入如下代码,运行可以获得ans_yn.sh同样的效果。
#!/bin/bash
read -p "Please input 'Y' or 'N' to execute this program:" input
if [ "${input}" == "Y" ] || [ "${input}" == "y" ]; then
echo "OK,continue"
exit 0
fi
if [ "${input}" == "N" ] || [ "${input}" == "n" ]; then
echo "Oh,interrupt!"
exit 0
fi
echo "I don't know what your choice is" && exit 0
1.2 多重、复杂条件判断式
在同一个数据的判断中,如果该数据需要进行多种不同的判断时,就需要更加复杂的判断式了
-
一个条件判断,分成功进行与失败进行(else)
if [条件判断式]; then else fi -
多个条件判断(if ... elif ... elif ... else)分多种不同情况执行
if ... elif ... elif ... else
注意:elif后面都要接then来处理(因为elif也是个判断式);else已经是最后的没有成立的结果了,所以else后面并没有then
我们把ans_yn.sh进一步改进,升级为 ans_yn_3.sh
vi ans_yn_3.sh
输入如下代码再次运行,可以获得与ans_yn.sh同样的结果。
#!/bin/bash
read -p "Please input 'Y' or 'N' to execute this program:" input
if [ "${input}" == "Y" ] || [ "${input}" == "y" ]; then
echo "OK,continue"
elif [ "${input}" == "N" ] || [ "${input}" == "n" ]; then
echo "Oh,interrupt!"
else
echo "I don't know what your choice is"
fi
仔细观察会发现,ans_yn_3.sh
相对于ans_yn_2.sh
和ans_yn.sh
,已经不需要exit 0
来控制程序的执行了,正是由于if ... elif ... elif ... else
提供了 多条件判断 的功能,将条件“Y/y”
,"N/n"
和非“Y/y/N/n”
根据优先级分了3个层次,让${input}
依次比对,符合哪一个条件,就只执行 该条件 对应的那个程序段。
可能上面一个例子不够爽,我们再来一个练习,加深理解~
撰写shell的要求:
(1)判断shell script的参数$1
是否为 hello,如果是的话,就显示“Hello,how are you”;
(2)如果没有加任何参数,就提示使用者必须要使用的参数下达法;
(3)而如果加入的参数不是hello,就提醒使用者仅能使用hello为参数。
这里涉及shell script的默认参数,不理解的话可以查看Linux 之 shell script -- 善用判断式中的 3.shell script 的默认变数
我们为这个shell命名 hello-2.sh
,输入如下代码,然后在命令行中按照👇3种方式执行,看有怎样的结果?
(1) sh hello-2.sh hello
(2) sh hello-2.sh hehe
(3) sh hello-2.sh
#!/bin/bash
if [ "$1" == "hello" ]; then
echo "Hello,how are you?"
elif [ "$1" == "" ]; then
echo "Please input the parameter, ex> {${0} someword}" #这里的${0}是变量,指shell的文本名
else
echo "Please input "hello" as the parameter, ex> {${0} someword}"
fi
2.Postscript
嗯,接下来又是一个撰写shell的练习(if ... then练习系列),我觉得很有用,尽管不是很明白网络服务端口是什么意思,还是把这里的代码抄下来了。
2.1 网络服务端口相关
-
netstat -tuln(目前主机有启动的服务)netstat
这个指令
这个指令可以查询到目前主机有开启的网络服务端口(service ports),我们可以利用netstat -tuln
来取得目前主机有启动的服务,借鸟哥的图展示一下:
-
几个常见的port与相关网络服务的关系
-- 80: WWW
-- 22: ssh
-- 21: ftp
-- 25:mail
-- 111:RPC(远程过程调用)
-- 631:CUPS(打印服务功能)
2.2 查看网络服务端口是否存在
#!/bin/bash
#1.先作一些告知的动作而已
echo "Now, I will detect your Linux server's services!"
echo -e "The www,ftp,ssh,and mail(smtp) will be detect! \n"
#2.开始进行一些测试的工作,并且也输出一些信息
testfile=/mnt/user/renyp/learning/netstat_checking.txt
netstat -tuln > ${testfile} #先转存数据到内存当中!不用一直执行 netstat
testing=$(grep ":80" ${testfile}) #侦测看 port 80 是否存在
if [ "${testing}" != "" ]; then
echo "WWW is running in your system."
fi
testing=$(grep ":22" ${testfile}) #侦测看 port 22 是否存在
if [ "${testing}" != "" ]; then
echo "SSH is running in your system."
fi
testing=$(grep ":21" ${testfile}) #侦测看 port 21 是否存在
if [ "${testing}" != "" ]; then
echo "FTP is running in your system."
fi
testing=$(grep ":25" ${testfile}) #侦测看 port 25 是否存在
if [ "${testing}" != "" ]; then
echo "Mail is running in your system."
fi
提示:由于 每个port是否存在的查询 都是平行关系,没有比较条件的优先级,所以都是if ... then
完成,而不需要采用if ... elif ... elif ... else
这种多条件判断的方式。
还有,变量的逻辑运算用$()
;数值运算用$((计算式))
网友评论