一、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 

 

posted on 2019-02-01 08:42  透明的千纸鹤  阅读(333)  评论(0编辑  收藏  举报