一、if语句
1. 单分支if条件语句
格式:
if [ 条件判断式 ] ;then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意:
if语句以if开始,以fi结尾;[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格。then后面跟符合条件之后执行的程序,可以放在[]后面,用“;”分隔,也可以换行写入,此时不需要用“;”分隔。
例如:编写一个脚本判断根分区的使用率
#!/bin/bash #2019-02-21 16:13 #统计根分区的使用率
#把根分区的使用率提取出来赋值给一个变量 rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1) #判断使用率是否小于30,如果小于,则输出信息.-le代表是否小于等于 if [ $rate -le 30 ] then echo "根分区空间充足!!" fi
2. 双分支if条件语句
格式:
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时执行的程序
fi
例如:编写一个脚本来备份MySQL数据库
#!/bin/bash #写一个脚本用来备份mysql数据库,并测试双分支if条件语句 #日期:2019-02-21 #把当前时间按照年月日的形式赋值给变量datetime datetime=$(date +%Y-%m-%d) #首先判断备份文件的目录存在不存在,-d代表判断该目录是否存在 if [ -d /tmp/mysql_bak ] then echo $(date) "开始备份" &> /tmp/mysql_bak/dbbak.log mysqldump -u root -p'root@123' mysql > /tmp/mysql_bak/mysql_$datetime.sql 2>> /tmp/mysql_bak/dbbak.log size=$(du -sh /tmp/mysql_bak/mysql_$datetime.sql) &>> /tmp/mysql_bak/dbbak.log echo $(date) "备份结束,大小为$size" &>> /tmp/mysql_bak/dbbak.log else mkdir /tmp/mysql_bak echo $(date) "开始备份" &> /tmp/mysql_bak/dbbak.log mysqldump -u root -p'root@123' mysql > /tmp/mysql_bak/mysql_$datetime.sql 2>> /tmp/mysql_bak/dbbak.log size=$(du -sh /tmp/mysql_bak/mysql_$datetime.sql) &>> /tmp/mysql_bak/dbbak.log echo $(date) "备份结束,大小为$size" &>> /tmp/mysql_bak/dbbak.log fi
3. 多分支if条件语句
格式:
if [ 条件判断式1 ]
then
当条件1成立时执行语句
elif [ 条件判断式2 ]
then
当条件2成立时执行语句
elif [ 条件判断式3 ]
then
当条件3成立时执行语句
......
else
当所有条件都不成立时执行语句
fi
例如,让用户输入一个文件名,并判断该文件是什么文件
#!/bin/bash #判断用户输入的是什么文件 #接收用户输入的文件名,并把它赋予变量file read -p "Please input a filename: " file #接下来判断该变量是否为空,-z为判断字符串是否为空,如果为空则跳出循环 if [ -z "$file" ] then echo "错误!请输入一个文件名。" exit 1 #判断输入的文件是否存在,判断式中加入“!”,表示判断式取反。-e为判断文件是否存在,存在为真。 elif [ ! -e "$file" ] then echo "错误!你输入的文件不存在。" exit 2 #判断文件是否为普通文件 elif [ -f "$file" ] then echo "$file 是一个普通文件!" #判断文件是否为目录 elif [ -d "$file" ] then echo "$file 是一个目录!" else echo "$file 是一个特殊类型的文件!" fi
二、case语句
格式:
case $变量名 in
值1)
如果变量的值等于值1,则执行程序1
;;
值2)
如果变量的值等于值2,则执行程序2
;;
值3)
如果变量的值等于值3,则执行程序3
;;
......
*)
如果变量的值不是以上给出的所有值,则执行该程序
;;
esac
注意:
(1)case语句和if...elif...else语句一样都是多分支条件语句。不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系
(2)case语句以case开头,以esac结尾;每个值必须以有括号“)”结束;每个程序段以双分号“;;”结束;最后的“*)”表示默认值,即当前面的所有值都无法匹配变量时,执行“*)”后面的程序段。
(3)在匹配的值中,我们可以用方括号表示一个连续的范围,如[0-9],代表数字;使用竖杠符表示或。
例如:让用户输入一个字符,并对该字符进行判断
#!/bin/bash #判断输入的字符是字母还是数字 read -p "请输入一个字符: " key #对变量进行判断 case $key in [0-9]) echo "你输入的是一个数字!" ;; [a-z]|[A-Z]) echo "你输入的是一个字母!" ;; *) echo "你输入的是一个特殊字符!" ;; esac
三、for循环
格式一:变量列表形式
for 变量 in 值1 值2 值3...
do
程序
done
注意:此格式for关键字后面跟要进行循环的变量,in关键字后面跟变量的取值列表,即后面有几个值就循环几次,且每次循环变量都按照顺序依次获取值,然后执行do与done之间的程序段,直到变量获取变量列表的最后一个值并执行完程序段后,循环结束。
例1:进行一个简单的循环,依次打印1、2、3、4、5
#!/bin/bash #依次打印数字 for sum in 1 2 3 4 5 do echo $sum done
例2:批量修改文件后缀。我的/root/sh目录中有许多测试脚本,重新创建一个文件夹把sh目录下以.sh结尾的文件复制到文件夹里并修改成.txt的文件。
#!/bin/bash #批量修改文件后缀名 mkdir /tmp/for_text cp /root/sh/*.sh /tmp/for_text cd /tmp/for_text new=txt ls > ls.log for i in $(cat ls.log) do name=$(echo $i | cut -d . -f1) mv $i ${name}.$new done
例3:批量压缩与加压缩文件。
#!/bin/bash #批量压缩与解压缩 mkdir /tmp/for1_text mkdir /tmp/for2_text cp /root/sh/*.sh /tmp/for1_text cd /tmp/for1_text houname=tar.gz ls > ls1.log for i in $(cat ls1.log) do tar -zcvf /tmp/for2_text/${i}.$houname $i &>> tar.log done cd /tmp/for2_text ls *.tar.gz > ls2.log for y in $(cat ls2.log) do tar -zxvf $y &> tar.log done
格式二:条件式形式
for (( 变量初始值;循环控制条件;变量变化 ))
do
程序
done
注意:for后面跟双小括号,在Linux是Shell中只有在双小括号中才可以进行加减乘除运算;在双小括号中,变量初始值、循环控制条件、变量变化以分号隔开;在Linux shell中不运行使用非整数类型的数作为循环变量。
例1:计算1到100的和
#!/bin/bash #计算1到100的和 s=0 for (( i=1;i<=100;i=i+1 )) do s=$(( $s + $i )) done echo "1到100的和等于:$s"
例2:批量添加用户
#!/bin/bash #批量添加用户并设置初始密码 read -t 30 -p "请输入添加用户的个数:" num read -t 30 -p "请输入初始密码值:" pass name=user #判断用户的输入是否为空值 if [ ! -z "$num" -a ! -z "$pass" ] then #判断用户输入的用户个数是否为数字 #把输入的num值中所有的数字都替换为空值,然后把剩下的值赋值给y y=$(echo $num | sed 's/[0-9]//g') #判断变量y是否为空值,若为空值,则变量num为数字 if [ -z "$y" ] then for (( i=1;i<=$num;i=i+1 )) do /usr/sbin/useradd $name$i echo $pass | /usr/bin/passwd --stdin "$name$i" done fi fi
四、while循环和until循环
1. while循环
格式:
while [ 条件判断式 ]
do
程序
done
注意:while循环是不定循环也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。
例1:使用while循环来计算1到100的和
#!/bin/bash #计算1到100的和 i=1 s=0 while [ $i -le 100 ] do s=$(( $s + $i )) i=$(( $i + 1 )) done echo $s
2. until
格式:
until [ 条件判断式 ]
do
程序
done
注意:until循环和while循环相反,until循环是如果条件判断式不成立则进行循环,执行程序;一旦条件判断式成立,则终止循环。
例1:也是计算1到100的和
#!/bin/bash #计算1到100的和 s=0 i=1 until [ $i -gt 100 ] do s=$(( $s + $i )) i=$(( $i + 1 )) done echo $s