linux脚本if then,Linux 之 shell script -- 条件判断式(if ... then)

条件判断式

很多时候,我们都必须需要某些数据来判断程序该如何进行,简单的方式可以利用 && 与 ||,但如果我们还想要执行一堆指令呢?就可以用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

shell 中利用 -n 来判定字符串非空

因此也可以使用 if [ -n ${1} ] 在shell脚本中判断字符串非空

2.Postscript

嗯,接下来又是一个撰写shell的练习(if ... then练习系列),我觉得很有用,尽管不是很明白网络服务端口是什么意思,还是把这里的代码抄下来了。

2.1 网络服务端口相关

netstat这个指令

这个指令可以查询到目前主机有开启的网络服务端口(service ports),我们可以利用netstat -tuln来取得目前主机有启动的服务,借鸟哥的图展示一下:

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这种多条件判断的方式。

还有,变量的逻辑运算用$();数值运算用$((计算式))

你可能感兴趣的:(linux脚本if,then)