一、流程控制语句
1、条件判断式
1)按照文件类型进行判断
两种判断格式
[root@localhost ~]# test -e /root/install.log [root@localhost ~]# [ -e /root/install.log ]
简单的判断式
[root@localhost ~]# [ -d /root ] && echo "yest" || echo "no" #第一个判断命令如果正确执行,则打印"yes",否则打印"no"
2)按照文件权限进行判断
[root@localhost ~]# [ -w student.txt] && echo "yes" || echo "no" #判断文件是拥有写权限的
3)两个文件之间进行比较
[root@localhost ~]# ln /root/student.txt /tmp/stu.txt #创建硬链接 [root@localhost ~]# [ /root/student.txt -ef /tmp/stu.txt] && echo "yes" || echo "no" #判断两个文件是否为同一个文件
4)两个整数之间的比较
[root@localhost ~]# [ 23 -ge 22 ] && echo "yes" || echo "no" #判断23是否大于等于22 [root@localhost ~]# [ 23 -le 22 ] && echo "yes" || echo "no" #判断23是否小于等于22
5)字符串的判断
[root@localhost ~]# name=fengj @给name变量赋值 [root@localhost ~]# [ -z "$name" ] && echo "yes" || echo "no" #判断name变量是否为空 [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 #给变量aa和变量bb赋值 [root@localhost ~]# [ "$aa" == "bb" ] && echo "yes" || echo "no" #判断两个变量的值是否相等
6)多重条件判断
[root@localhost ~]# aa=11 [root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no" #判断变量aa是否有值,同时判断变量aa的是否大于23 #因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假
2、单分支if语句
单分支if条件语句
if [ 条件判断式 ];then 程序 fi #或者 if [ 条件判断式 ] then 程序 fi
单分支条件语句需要注意几个点
#if语句使用fi结尾,和一般语言使用大括号结尾不同
#[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
#then后面跟符合条件之后执行的程序,可以放在[]之后,用”;”分割。也可以换行写入,就不需要”;”了
例子1:判断登陆的用户是否为root
#!/bin/bash test=$(env | grep "USER" | cut -d "=" -f 2) if [ "$test" == root] then echo "Current user is root." fi
例子2:判断分区使用率
#!/bin/bash #统计根分区使用率 #把根分区使用率作为变量值赋予变量rate rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1) if [ $rate -ge 80 ] then echo "Warning! /dev/sda3 is full!!" fi
3、双分支if语句
双分支if条件语句
if [ 条件判断式 ] then 条件成立时,执行的程序 else 条件不成立时,执行的另一个程序 fi
例子1:判断输入的是否是一个目录
#!/bin/bash #判断输入的文件是否是一个目录 read -t 30 -p "Please input a directory: " dir if [ -d $dir ] then echo "yes" else echo "no" fi
例子2:判断apache是否启动
#!/bin/bash #截取httpd进程,并把结果赋予变量test test=$(ps aux | grep httpd | grep -v grep) 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-err.log fi
4、多分支if语句
多分支if条件语句
if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序1 elif [ 条件判断式2 ] then 当条件判断式2成立时,执行程序2 ...省略更多条件 else 当所有条件都不成立时,最后执行此程序 fi
例子
#!/bin/bash #字符界面加减乘除计算器 read -t 30 -p "Please input num1: " num1 read -t 30 -p "Please input num2: " num2 #通过read命令接收要计算的数值,并赋予变量num1和num2 read -t 30 -p "Please input a operator: " ope if [ -n "$num1" -a -n "$num2" -a -n "$ope" ] #第一层判断,用来判断num1,num2和ope中都有值 then test1=$(echo $num1 | sed 's/[0-9]//g') test2=$(echo $num2 | sed 's/[0-9]//g') #定义变量test1和test2的值为$(命令)的结果 #后续命令作用是,把变量test1的值替换为空。如果能替换为空,证明num1的值为数字 #如果不能替换为空,证明num1的值为非数字。我们使用这种方法判断变量num1的值为数字 #用同样的方法测试test2变量 if [ -z "$test1" -a -z "$test2" ] #第二层判断,用来判断num1和num2为数值 #如果变量test1和test2的值为空,则证明num1和num2是数字 then #如果test1和test2是数字,则执行以下命令 if [ "$ope" == '+' } #第三层判断用来确认运算符 #测试变量$ope中是什么运算符 then sum=$(( $num1 + $num2)) #如果是加号则执行加法运算 elif [ "$ope" == '-' ] then sum=$(($num1 - $num2)) #如果是减号,则执行减法运算 elif [ "$ope" == '*' ] then sum=$(( $num1 * $num2)) #如果是乘号,则执行乘法运算 elif [ "$ope" == '/' ] then sum=$(( $num1 / $num2)) #如果除号,则执行除法运算 elif [ "$ope" == '%' ] then sum=$(( $num1 % $num2)) #如果是取模,则执行取模运算 else echo "Please enter a valid symbol" #如果运算符不匹配,提示输入有效的符号 exit 10 #并退出程序,返回错误代码10 fi elif #如果test1和test2不为空,说明num1和num2不是数字 echo "Please enter a valid value" #则提示输入有效的数值 exit 11 #并退出程序,返回错误代码11 fi elif echo "qing shuru neirong" exit 12 fi echo " $num1 $ope $num2 : $num" #输出数值运算的结果
例子:从1加到100
#!/bin/bash #从1加到100 s=0 for(( i=1;i<=100;i=i+1 )) do s=$(( $s+$i)) done echo "The sum of 1+2+...+100 is: $s"
例子:批量添加指定数量的用户
#!/bin/bash #批量添加指定数量的用户 read -p "Please input user name: " -t 30 name read -p "Please input the number of users: " -t 30 num read -p "Please input the password of users: " -t 30 pass if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass"] then y=$(echo $num | sed 's/[0-9]//g') if [ -z "$y" ] then for(( i=1;i<=$num;i=i+1 )) do /usr/sbin/useradd $name$i &>/dev/null echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null done fi fi
5、case语句
多分支case条件语句
#case语句和if..elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; ...省略其他分支 *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
6、for循环
语法一:
for 变量 in 值1 值2 值3 ... do 程序 done
例子:批量解压脚本
#!/bin/bash #批量解压缩脚本 cd /root/test ls *.tar.gz > /tmp/ls.log for i in $(cat ls.log) do tar -zxf $i &>/dev/null done rm -rf /tmp/ls.log
语法二
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
7、while循环和until循环
1)while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才停止。这就和for的固定循环不太一样了。
while [ 条件判断式 ] do 程序 done
2)until循环
# until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。
until [ 条件判断式 ] do 程序 done