1. if语句
(1) 单分支if条件语句
格式为:
# 注意条件判断式两端的空格
if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi
例:判断分区使用率
#!/bin/bash #获取根分区的使用率 rate=$(df -h | grep "/dev/sda5" | awk '{print $5}' | cut -d "%" -f 1) if [ $rate -ge 10 ] then echo "/dev/sda5 is over 10%!!" fi
(2) 双分支if条件语句
格式为:
if [ 条件判断式 ] then 条件成立时,执行的程序 else 条件不成立时,执行的另一个程序 fi
例1:备份/etc目录(同样适用于实际情况中的mysql备份)
#!/bin/bash #备份mysql数据库 #Author : #同步系统时间 #ntpdate asia.pool.ntp.org &> /dev/null #把当前系统时间按照"年月日"格式赋予变量date date=$(date +%y%m%d) #统计mysql数据库的大小,并将其赋予size变量 size=$(du -sh /etc) if [ -d /tmp/dbbak ] then echo "Date : $date!" > /tmp/dbbak/dbinfo.txt echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt cd /tmp/dbbak tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null rm -rf /tmp/dbbak/dbinfo.txt else mkdir /tmp/dbbak echo "Date : $date!" > /tmp/dbbak/dbinfo.txt echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt cd /tmp/dbbak tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null rm -rf /tmp/dbbak/dbinfo.txt fi
例2:判断apache是否启动
#!/bin/bash #Author : #使用nmap命令扫描服务器(-sT表示扫描指定服务器上开启的TCP端口),并截取apache服务的状态,赋予变量port port=$(nmap -sT 192.168.1.155 | grep tcp | grep http | awk '{print $2}') if [ "$port"=="open" ] 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
(3) 多分支if条件语句
格式为:
if [ 条件判断式1 ] then 当条件判断式1成立,执行程序1 elif [ 条件判断式2 ] then 当条件判断式2成立时,执行程序2 ...省略更多条件... else 当所有条件都不成立时,最后执行此程序 fi
例:判断用户输入的是什么文件
#!/bin/bash #接收键盘收入,并赋予变量file read -p "Please input a filename: " file if [ -z file ] #判断file变量是否为空 then echo "Error,please input a filename" exit 1 elif [ ! -e "$file" ] #判断file的值是否存在 then echo "Your input is not a file!" exit 2 elif [ -f "$file" ] #判断file的值是否为普通文件 then echo "$file is a regulare file!" elif [ -d "$file" ] then echo "$file is a directory!" else echo "$file is an other file!" fi
输出结果:
[root@localhost sh]# ./if4.sh Please input a filename: Your input is not a file! [root@localhost sh]# echo $? 2 [root@localhost sh]# ./if4.sh Please input a filename: /root /root is a directory!
2. case语句
case语句和if...elif...fi语句一样都是多分支条件语句,不过case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case的格式为:
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; ...省略其他分支... *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
例:判断用户输入
[root@localhost sh]# vi case1.sh
#!/bin/bash read -p "Please choose yes/no: " -t 30 cho case $cho in "yes") echo "Your choose is yes!" ;; "no") echo "Your choose is no!" ;; *) echo "Your choose is error!" ;; esac
输出结果:
[root@localhost sh]# chmod 755 case1.sh
[root@localhost sh]# ./case1.sh Please choose yes/no: yes Your choose is yes! [root@localhost sh]# ./case1.sh Please choose yes/no: no Your choose is no! [root@localhost sh]# ./case1.sh Please choose yes/no: ls Your choose is error!
3. for循环
Linux中的for循环有多种语法格式:
格式1: for 变量 in 值1 值2 值3 do 程序 done
例1:打印时间及输出结果
[root@localhost sh]# vi for1.sh #!/bin/bash for time in morning afternoon evening do echo "This time is $time" done [root@localhost sh]# chmod 755 for1.sh [root@localhost sh]# ./for1.sh This time is morning This time is afternoon This time is evening
例2:批量解压缩
[root@localhost sh]# vi for2.sh #!/bin/bash cd /tmp ls *.tar.gz > ls.log for i in $(cat ls.log) do tar -zxf $i &> /dev/null done rm -rf /tmp/ls.lo
格式2: for (( 初始值;循环控制;变量变化 )) do 程序 done
例1:从1加到100,并显示输出结果
[root@localhost sh]# vi for3.sh #!/bin/bash s=0 for(( i=0;i<=100;i=i+1 )) do s=$(( $s + $i )) done echo "The sum of 1+2+..+100 is : $s" [root@localhost sh]# chmod 755 for3.sh [root@localhost sh]# ./for3.sh The sum of 1+2+..+100 is : 5050
注:两种for的区别在于是否事先知道处理的个数,如果知道,执行第二种for语法,否则执行第一种语法。
例2:批量添加指定数量的用户
[root@localhost sh]# vim for4.sh #!/bin/bash #Author: read -t 30 -p "Please input username:" name read -t 30 -p "Please input the number of users:" num read -t 30 -p "Please input the passed of users:" 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
执行结果:
[root@localhost sh]# cat /etc/passwd ...... user1:x:501:503::/home/user1:/bin/bash user2:x:502:504::/home/user2:/bin/bash
4. while循环与until循环
(1) while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样,其格式为:
while [ 条件表达式 ] do 程序 done
例1:从1加到100
[root@localhost sh]# vim while1.sh #!/bin/bash #Author: s=0 i=1 while [ $i -le 100 ] do s=$(( $s + $i )) i=$(( $i + 1 )) done echo "The sum is : $s"
(2) until循环和while循环相反。until循环只要条件判断式不成立则进行循环,并执行循环程序。一旦条件判断式成立,则循环终止,其格式为:
until [ 条件判断式 ] do 程序 done
例:从1加到100
[root@localhost sh]# vim while1.sh #!/bin/bash #Author: s=0 i=1 until [ $i -gt 100 ] do s=$(( $s + $i )) i=$(( $i + 1 )) done echo "The sum is : $s"