您的位置:首页 > 运维架构 > Shell

十二.shell编程之条件判断与流程控制

2016-04-26 18:10 579 查看
shell编程之条件判断与流程控制

流程控制语句:

*条件判断式

*单分支if语句

*双分支if语句

*多分支if语句

*case语句

*for循环

*while循环和until循环

第一章 条件判断式语句

1.1概述:即该程序根据给定的条件来判断是否存在

1.2按文件类型判断

测试选项 作用

-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)

-e 文件 判断该文件是否存在(存在为真)

-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)

**两种判断格式

*test -e 文件路径(或文件名)

*[ -e 文件路径(或文件名)] 推荐用这个

eg:[ -e /root/install.log ]

echo $?



[ -e /root/install.log ] && echo yes || echo no

1.3按文件权限判断

测试选项 作用

-r文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)

-w文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)

-x文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)

1.4两个文件之间的比较

测试选项作用

文件1 -nt 文件2
判断文件1的修改时间是否比文件2的新(如果新则为真)

文件1 -ot 文件2
判断文件1的修改时间是否比文件2的旧(如果旧则为真)

文件1 -ef 文件2
判断文件1与文件2的inode号是否一致,可以理解为两个文件是否一样。这个方法

是用于判断硬链接的最好方法

1.5两个整数之间的比较

测试选项 作用

整数1 -eq 整数2
判断整数1是否和整数2相等(相等为真)

整数1 -ne 整数2
判断整数1是否和整数2不相等(不相等为真)

整数1 -gt 整数2
判断整数1是否大于整数2(大于为真)

整数1 -lt 整数2
判断整数1是否小于整数2(小于为真)

整数1 -ge 整数2
判断整数1是否大于等于整数2(大于等于为真)

整数1 -le 整数2
判断整数1是否小于等于整数2(小于等于为真)

1.6字符串的判断

测试选项 作用

-z 字符串
判断字符串是否为空(为空返回真)

-n 字符串
判断字符串是否为非空(非空返回真)

字符串1 == 字符串2
判断字符串1是否和字符串2相等(相等返回真)

字符串1 != 字符串2
判断字符串1是否和字符串2不相等(不相等返回真)

1.7多重条件判断

测试选项 作用

判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真

判断1 -o 判断2
逻辑或,判断1和判断2有一个成立,最终的结果就为真

!判断 逻辑非,使原始的判断式取反

第二章单分支if语句

2.1概述

Shell的语法结构和绝大多数语言有所不同

2.2单分支if语句

格式:

if [条件判断式];then

程序

fi



if [条件判断式]

then

程序

fi

单分支条件语句需要注意几个点:

*if语句使用fi结尾,和一般语言使用大括号结尾不同

*[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

*then后面跟符号条件之后执行的程序,可以放在[]之后,用";"分割,也可以换行写入,就不需

要";"了

扩展:cut命令用法:

eg1:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 1,5`

$ echo $a

结果:root:root

上面的例子中,把 root:x:0:0:root:/root:/bin/bash 重定向到cut命令里,-d表示分隔

符,这里使用冒号: 作为分隔符,-f 表示字段,选择了第1,和第5个字段

eg2:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 1` 只打印第一个字段field

$ echo $a

结果:root

eg3:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 1-` 打印第一个字段以后的所

有字段,包含第一个字段

$ echo $a

结果:root:x:0:0:root:/root:/bin/bash

eg4:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -d : -f 2-4` 截取第2到第4个字段

$ echo $a

结果:x:0:0

eg5:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -c 2-5 `

$ echo $a

结果:oot:

eg6:$ a=`echo root:x:0:0:root:/root:/bin/bash | cut -c -2 ` // 截取前两个字符

$ echo $a

结果:ro

eg:判断登陆用户是否是shiyanlou

#!/bin/bash #注释是Bash脚本

test=$(env | grep "USER" | cut -d "=" -f 2) #定义一个变量并给其赋值

if [ "$test" == "shiyanlou" ] #条件判断表达式之按字符串的判断

then #Shell中if语句的固定结构

echo "dangqian yonghu is shiyanlou"#程序

fi #Shell中if语句的固定结构

2.3例:判断分区使用率

#!/bin/bash

#统计根分区使用率

test=$(df -h | grep /dev/xvdb1 | awk '{print $5}' | cut -d "%" -f 1)

#把根分区使用率作为变量值赋予变量test

if [ "$test" -ge "50" ]

then

echo "/ is full"

fi

第三章双分支if语句

3.1例:判断输入的是否是一个目录

格式:

if [ 条件表达式 ]

then

条件成立时,执行的程序

else

条件不成立时,执行的另一个程序

fi

eg:判断输入的是否是一个目录

#!/bin/bash

#read命令用于读取键盘输入的数据

read -t 30 -p "please input a dir:" dir

#双分支if语句结构

if [ -d "$dir" ]

then

echo "he is a dir"

else

echo "he is a file"

fi

扩展:read命令的用法

read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一

个标准变量中。

eg:read name #从键盘输入

eg:read -p "Enter your name:" name #-p参数,允许在read命令行中直接指定一个提示

eg:read -t 5 -p "please enter your name:" name #使用read命令存在着潜在危险。脚本很可能会停下

来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用 -t 选项指定一个计时器,指定read命令

等待输入的秒数。当计时满时,read命令返回非零值(0为正常退出状态);

具体其它用法参考百度

3.2判断Apache服务是否启动

**扩展:一个网站正常的部分有:美工 程序 运维 Apache(要想程序可以运行必须通过它或类似的) Linux(服务器) 域名 IP 带宽

程序部署到Apache上,才能执行,而且Apache要放到Linux系统中,所以一个网站不能瘫痪,就必须保证其Apache服务一直是启动状态。

那如何保证呢?我们可以写一个shell脚本,假如其Apache服务卡了那我们可以设置重新启动

ps aux :查看Linux系统中正在运行的所有进程。相当于Windows系统中的任务管理器

ps aux | grep httpd | grep -v grep :查看Apache服务是否启动 (当然前提是其Linux系统中是否安装了Apache)

service httpd start : 启动Apache服务

service httpd stop:停止Apache服务

eg:shell脚本中编写程序Apache启动服务

#!/bin/bash

test=$(ps aux | grep httpd | grep -v grep)

#截取httpd进程,并把结果赋予变量test

if [ -n "$test" ]

#如果test的值不为空,则执行then中命令

then

echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log

else

/etc/rc.d/init.d/httpd start & > /dev/null

echo "$(date) restart httpd !" >> /tmp/autostart-acc.log

fi

问题:我们写了这个脚本,假如我们Apache服务卡了,那我们没有执行这个脚本文件,也是没用啊???怎么让这个脚本随时再执行呢???(注意:我们这个脚本文件命名不能带有httpd的名字,不然该文件程序会失效)

第四章多分支if语句

4.1简介

格式:

if [ 条件判断式1 ]

then

当条件判断式1成立时,执行程序1

elif [ 条件判断式2 ]

then

当条件判断式2成立时,执行程序2

...省略更多条件...

else

当所有条件都不成立时,最后执行此程序

fi

4.2例:计算器???

#!/bin/bash

read -t 30 -p "please input num1:" num1

read -t 30 -p "please input num2:" num2

read -t 30 -p "please input operator:" op

if [ -n "$num1" -a -n "$num2" -a -n "$op" ]

then

test1=$(echo $num1 | sed 's/[0-9]//g') ???

test2=$(echo $num2 | sed 's/[0-9]//g') ???

if [ -z "$test1" -a -z "$test2" ]

then

if [ "$op" == "+" ]

then

res=$(($num1+$num2))

elif [ "$op" == "-" ]

then

res=$(($num1-$num2))

elif [ "$op" == "*" ]

then

res=$(($num1*$num2))

elif [ "$op" == "/" ]

then

res=$(($num1/$num2))

else

echo "operator input error"

exit 10 ???

fi

else

echo "num input error"

exit 11

fi

else

echo "please input content"

exit 12

fi

echo "$num1$op$num2=$res"

4.3例:判断用户输入的是什么文件

#!/bin/bash

read -t 30 -p "please input a filename:" file

if [ -z "$file" ]

then

echo "please input a filename"

exit 11 ???

elif [ ! -e "$file" ]

then

echo "$file not is a file"

exit 12

elif [ -f "$file" ]

then

echo "$file is a putong file"

elif [ -d "$file" ]

then

echo "$file is a dir"

else

echo "$file is a other file"

fi

第五章多分支case语句

5.1多分支case语句

*case语句和if...elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句

只能判断一种条件关系,而if语句可以判断多种条件关系。

*格式:

case $变量名 in

"值1")

如果变量的值等于值1,则执行程序1

;;

"值2")

如果变量的值等于值2,则执行程序2

;;

...省略其他分支...

*)

如果变量的值都不是以上的值,则执行此程序

;;

esac

eg:

#!/bin/bash

read -t 30 -p "please choose:" cho

case $cho in

"yes")

echo "you are choose yes"

;;

"no")

echo "you are choose no"

;;

*)

echo "you are choose error"

;;

esac

第六章for循环

6.1for循环

语法格式一:

for 变量 in 值1 值2 值3...

do

程序

done

eg1:#!/bin/bash

for i in 1 2 3 4 5

do

echo $i

done

eg2:批量解压缩脚本

$ cd ~

$ mkdir test(假如test文件夹中有若干个tar.gz压缩文件,那我们用一般方法解压就很麻烦)

$ vi a2.sh

#!/bin/bash

cd /home/shiyanlou/test/

ls *.tar.gz > ls.log #将所有的tar.gz压缩文件覆盖到ls.log文件中

#echo $(cat ls.log)

for i in $(cat ls.log) #利用for循环依次解压tar.gz文件

do

tar -zxvf $i

done

语法格式二:

for((初始值;循环控制条件;变量变化))

do

程序

done

eg:for(i=0;i<2;i++)

do

echo $i

done

6.2例:批量添加删除指定数量的用户 ???

#!/bin/bash

#批量添加指定数量的用户

read -t 30 -p "please input adduser name:" name

read -t 30 -p "please input adduser count:" num

read -t 30 -p "please input adduser password:" password

if [ -z "$name" -a ! -z "$num" -a ! -z "password" ]

then

y=$(echo $num | sed 's/[0-9]//g')

if [ -z "$y" ]

then

for((i=1;i<=$num;i++))

do

/usr/sbin/useradd $name$i & > /dev/null

echo $password | /usr/bin/passwd --stdin $name$i & > /dev/null

done

fi

fi

第七章while循环和until循环

7.1while循环和until循环

*while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这

就和for的固定循环不太一样了。

*语法格式:

while [ 条件判断式 ]

do

程序

done

*eg:

#!/bin/bash

i=1

sum=0

while [ $i -le 100 ]

do

sum=$(($sum+$i))

i=$(($i+1))

done

ehco $sum

*until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循

环。

*语法格式:

until [ 条件判断式 ]

do

程序

done

eg:

#!/bin/bash

i=1

sum=0

until [ $i -gt 100 ]

do

sum=$(($sum+$i))

i=$(($i+1))

done

ehco $sum
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: