shell脚本判断语句

明月清风 2016-11-01 87浏览
首页/正文
分享到: / / / /

if...then

if [条件判断式] ; then
    #当条件判断式成立时,可以执行的命令工作内容。 
fi #将 if 反过来写,结束 if 的意思,代表此判断结束。

其中判断式可以是多个,多个判断式之间还可以用 && 或 || 进行判断。

&&:短路与,两边做与运算判断,前面正确执行,后面才执行。

|| :短路或,两边做或运算判断,前面错误,则执行后面。 如:["$yn"=="Y" -o "$yn=="y"]可以写为["$yn=="Y"]||["$yn=="y"] 怎样书写看个人习惯。

示例1:当用户输入Y、y、yes时则输出PASS,当用户输入N、n、no时则输出FAIL。

[root@ZhangSir ~/bin]#vim 1.sh
#!/bin/bash
read -p "Please input:" yn
if [ "$yn" == "y" ] || [ "$yn" == "Y" ] || [ "$yn" == "yes" ];then
 echo "PASS"
fi
if [ "$yn" == "n" ] || [ "$yn" == "N" ] || [ "$yn" == "no" ];then
 echo "FAIL"
fi
​
[root@ZhangSir ~/bin]#. 1.sh 
Please input:no
FAIL
[root@ZhangSir ~/bin]#. 1.sh 
Please input:y
PASS

多重判断

同一数据进行多种不同判断

if [条件判断式] ; then 
    #当条件判断式成立时,可以执行的命令工作内容。
else
    #当条件判断式不成立时,可以执行的命令工作内容。
fi #将 if 反过来写,结束 if 的意思,代表此判断结束。
if [条件判断式一] ; then
    #当条件判断式一成立时,可以执行的命令工作内容。
elif [条件判断式二] ; then
    #当条件判断式二成立时,可以执行的命令工作内容。

else
    #当条件判断式一与二均不成立时,可以执行的命令工作内容。

fi #将 if 反过来写,结束 if 的意思,代表此判断结束。

示例2:将示例1改写一遍。

[root@ZhangSir ~/bin]#vim 1.sh
#!/bin/bash
read -p "Please input:" yn
if [ "$yn" == "y" ] || [ "$yn" == "Y" ] || [ "$yn" == "yes" ];then
 echo "PASS"
elif [ "$yn" == "n" ] || [ "$yn" == "N" ] || [ "$yn" == "no" ];then
 echo "FAIL"
else
 echo "I don't know what your choice is"
fi
​
[root@ZhangSir ~/bin]#. 1.sh 
Please input:s
I don't know what your choice is
[root@ZhangSir ~/bin]#. 1.sh 
Please input:n
FAIL
[root@ZhangSir ~/bin]#. 1.sh 
Please input:y
PASS

示例3:1.判断 $1 是否为 hello ,若是则显示“hello world!” 2.如果没有加任何参数,就提醒用户必须要使用的参数。 3.如果加入参数的参数不是hello,就提醒用户仅能使用hello。

[root@ZhangSir ~/bin]#vim 3.sh
#!/bin/bash
if [ "$1" == "hello" ];then
 echo "hello world!"
elif [ "$1" == "" ];then
 echo "You MUST input parameters,ex> {$0 someword}"
else
 echo "The only parameters is 'hello',ex {$0 hello}"
fi
​
[root@ZhangSir ~/bin]#. 3.sh 
You MUST input parameters,ex> {-bash someword}
[root@ZhangSir ~/bin]#. 3.sh h
The only parameters is 'hello',ex {-bash hello}
[root@ZhangSir ~/bin]#. 3.sh hello
hello world!

case...esac

ease $变量名称 in #ease 与 in 之间填变量。
"第一个变量内容") #每个变量内容用双引号引起来,后面用右半边小括号结尾“)” 
    程序段    #当变量内容符合时执行的内容。
    ;;   #每个类型结束后需要两个分号来处理。
"第二个变量内容")
    程序段
    ;;
*)   #最后一个变量用“ * ”来表示其他值,表示不属于上述变量内容的值。不属于第一和第二个变量内容的其他程序执行段。
    程序段
;;
esac //case反过来写,做判断式结尾。

示例4:用此方法将示例3重写。

[root@ZhangSir ~/bin]#vim 4.sh
#!/bin/bash
case $1 in
 "hello")
 echo "hello world!"
;;
 "")
 echo "You MUST input parameters,ex> {$0 someword}"
;;
*)
 echo "Usage $0 {hello}"
;;
esac
​
[root@ZhangSir ~/bin]#. 4.sh
You MUST input parameters,ex> {-bash someword}
[root@ZhangSir ~/bin]#. 4.sh d
Usage -bash {hello}
[root@ZhangSir ~/bin]#. 4.sh hello
hello world!

示例5:

1.在用户输入 1 时,显示 Your choice is ONE。

2.在用户输入2 时,显示 Your choice is TOW。

3.在用户输入其他字符时,则提示只能输入1或2。

[root@ZhangSir ~/bin]#vim 5.sh
case $choice in
 "hi")
 echo "Your choice is ONE"
;; 
 "hello")
 echo "Your choice is TWO"
;; 
*) 
 echo "Usage $0 {1 or 2}"
;;
esac 

[root@ZhangSir ~/bin]#. 5.sh 
Input your choice:d
Usage -bash {1 or 2}
[root@ZhangSir ~/bin]#. 5.sh 
Input your choice:1
Your choice is ONE
[root@ZhangSir ~/bin]#. 5.sh 
Input your choice:2
Your choice is TWO

function

函数(function)功能:在计算机中函数是指一段在一起的、可以做某一件事儿的程序。

利用这个特性,我们可以将一段需要重复执行的代码定义为一个函数,然后再需要的之后直接去调用这个函数,而不用去重复的写某段代码,我们也就可以将很多功能利用函数将其做成模块化的。

function 函数名称 () { 程序段 }

因为shell脚本的执行方式是由上而下、从左到右,所以我们需要在shell 脚本中将function定义写在程序的最前面,否则可能会导致部分代码无法成功找到function。

示例6:将示例5利用 function 来构建。

[root@ZhangSir ~/bin]#vim 6.sh
#!/binsh
function printit () {
 echo -n "Your choice is "
}
case $1 in
 "1")
 printit; echo "ONE"
;;
 "2")
 printit; echo "TOW"
;;
 *)
 echo "Usage $0 {1 or 2}"
;;
esac

[root@ZhangSir ~/bin]#. 6.sh 
Usage -bash {1 or 2}
[root@ZhangSir ~/bin]#. 6.sh 1
Your choice is ONE
[root@ZhangSir ~/bin]#. 6.sh 2
Your choice is TOW

function 也是有内置变量的,其内置变量与shell script很类似,函数名称是$0,而后续接的变量也是以$1、$2、$3......来表示的,和shell script的内置变量一样,但是function 调用的可是其自己的变量,千万不要弄混了哦。

[root@ZhangSir ~/bin]#vim 6.sh
#!/binsh
function printit () {
 echo "Your choice is $1"   //function调用其内置变量$1
}
case $1 in
 "1")
 printit ONE   //function 的 $1 定义为ONE
;;
 "2")
 printit TOW  //function 的 $1 定义为TOW
;;
 *)
 echo "Usage $0 {1 or 2}"
;;
esac

[root@ZhangSir ~/bin]#. 6.sh 
Usage -bash {1 or 2}
[root@ZhangSir ~/bin]#. 6.sh 1
Your choice is ONE
[root@ZhangSir ~/bin]#. 6.sh 2
Your choice is TOW

通过上面的例子,就可以很方便的理解了吧,function的内置变量虽然和shell script的内置变量类似,但是它们可是各调用各的变量哦。

不定式循环

当判断式成立时,则循环至判断式不成立。

while [判断式] do 程序段落 done

当判断式不成立时,则循环至判断式成立。

until [判断式] do 程序段落 done

示例7:当用户输入YES或yes时,才终止程序,否则一直告知用户输入字符。

[root@ZhangSir ~/bin]#vim 7.sh
#!/bin/bash
while [ "$yn" != "YES" ] && [ "$yn" != "yes" ]
do
 read -p "Do you love me ?" yn
done
echo "OK! I love you too!"

[root@ZhangSir ~/bin]#. 7.sh 
Do you love me ?no
Do you love me ?no
Do you love me ?NO
Do you love me ?yes
OK! I love you too!

上述例子中,判断式为输入非yes或YES时,就开始不断循环,那么用until该怎样呢?

[root@ZhangSir ~/bin]#vim 7.sh 
#!/bin/bash
until [ "$yn" == "YES" ] || [ "$yn" == "yes" ]
do
 read -p "Do you love me ?" yn
done
echo "OK! I love you too!"

[root@ZhangSir ~/bin]#. 7.sh 
Do you love me ?no
Do you love me ?NO
Do you love me ?yes 
OK! I love you too!

数值运算方式循环

for ((初始值;限制值;执行步长)) do 程序段落 done

初始值:某个变量在循环中的初始值。

限制值:当变量的值在此限制范围内,就继续循环。

执行步进:没做一次循环时变量的变化范围。若每次都是+1则可写为“i++”方式。

示例8:编写脚本测试本机与172.16.0.0~172.16.255.254之间网络是否连接,并将连接信息写入文件。

[root@ZhangSir ~/bin]#vim 8.sh 
#!/bin/bash
network="172.16"
for ((a=0;a<=255;a++))
do
 for ((b=0;b<255;b++))
 do
 ping -c 1 -w 1 ${network}.$a.$b &> /dev/null && result=0 || result=1
 if [ "$result" == "0" ];then
 echo "Server ${network}.$a.$b is up" >>./ping
 else
 echo "Server ${network}.$a.$b is down" >>./ping
 fi
 done
done

[root@ZhangSir ~/bin]#cat ping 
Server 172.16.0.0 is down
Server 172.16.0.1 is up
Server 172.16.0.2 is down
Server 172.16.0.3 is down
Server 172.16.0.4 is down
Server 172.16.0.5 is down
Server 172.16.0.6 is down
Server 172.16.0.7 is down
Server 172.16.0.8 is down
Server 172.16.0.9 is down
Server 172.16.0.10 is down
Server 172.16.0.11 is down
Server 172.16.0.12 is down
Server 172.16.0.13 is down
......(省略)

固定式循环

不定式循环就是要循环到“符合某个状态”,其循环次数是不固定的。 而固定式循环就是确定了状态,从而指定循环次数。

for 变量名 in 第一次循环变量内容 第二次循环变量内容 ...... do 程序段落 done

示例9:

[root@ZhangSir ~/bin]#vim 9.sh
#!/bin/bash
for say in first second third
do
 echo " This is the ${say} time i say love"
done

[root@ZhangSir ~/bin]#. 8.sh 
 This is the first time i say love
 This is the second time i say love
 This is the third time i say love

shell script的追踪与调试

脚本写完了,可不可以不用执行,就能知道脚本有没有问题呢?

我们可以直接以bash的相关参数来进行判断。

sh [-nvx] scripts.sh

  • -n:不执行脚本,仅查询语法问题。

  • -v:在执行脚本前,现将脚本内容输出到屏幕。

  • -x:将使用到的脚本内容显示到屏幕上,可以查看脚本执行到哪出现问题。

最后修改:2016-11-01 19:32:43 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇