一、条件判断式语句

1.1 按照文件类型进行判断

测试选项 作用
-b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件 判断该文件是否存在,并且是否为非空(非空为真)
-S 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

两种判断格式:

  1. test -e /root/install.log
  2. [-e /root/install.log]
$ [ -e /root/install.log ]
$ echo $?
0
$ [ -e /root/install.log_not_exist ]
$ echo $? 
1
$ [ -e /root/install.log ] && echo yes || echo no
yes

1.2 按文件权限判断

测试选项 作用
-r 文件 判断文件是否存在,并且该文件拥有读权限(有读权限为真)
-w 文件 判断文件是否存在,并且该文件拥有写权限(有写权限为真)
-x 文件 判断文件是否存在,并且该文件拥有执行权限(有执行权限为真)
-u 文件 判断文件是否存在,并且该文件拥有SUID权限 (有SUID权限为真)
-g 文件 判断文件是否存在,并且该文件拥有SGID权限 (有SGID权限为真)
-k 文件 判断文件是否存在,并且该文件拥有SBit权限 (有SBit权限为真)

1.3 两个文件之间进行比较

测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新 (如果新则为真)
文件1 -ot 文件2 判断文件1的修改时候是否比文件2的旧 (如果旧则为真)
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。

1.4 两个整数之间的比较

测试选项 作用
整数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.5 字符串的判断

测试选项 作用
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断字符串是否为非空 (非空返回真)
字符串1 == 字符串2 判断字符串1是否和字符串2相等(相等返回真)
字符串1 != 字符串2 判断字符串1是否和字符串2不相等(不相等返回真)
字符串1 =~ 字符串2 判断字符串1是否包含字符串2(包含返回真)

1.6 多重条件判断

测试选型 作用
判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真
判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真
! 判断 逻辑非,使原始的判断式取反

二、if语句

2.1 单分支if语句

if [ 条件判断式 ];then
	程序语句
fi

或者

if [ 条件判断式 ]
then
	程序语句
fi

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

  • if 语句使用fi结尾,和一般语言使用大括号结尾不同
  • [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
  • then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了。

例子1:判断当前登录用户是否为root

#! /bin/bash
user=`whoami`
if [ $user=="root" ];then
	echo "Current user is root"
fi

列子2:判断分区使用率 查看磁盘使用情况:

df -h
#!/bin/bash
# 统计分区使用率
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1)
if [ $rate -ge 80 ];then
	echo "Warning! /dev/sda3 is full"
fi

2.2 双分支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.3 多分支if语句

if [ 条件判断式1 ];then
	当条件判断式1成立时,执行语句
elif [ 条件判断式2 ];then
	当条件判断式成立时,执行的语句
else 
	当所有都不成立时,最后执行此语句
fi

三、case语句

case $变量名 in
	"值1")
			如果变量值等于值1,则执行程序1
			;;
	"值2")
			如果变量值等于值2,则执行程序2
			;;
	 *)
	 		如果以上值都不满足,则执行此程序
	 		;;
esac

四、for循环语句

4.1 语法一

for 变量 in 值1 值2 值3 ...
	do 
		程序
	done

例子1:

for i in 1 2 3 4 5
	do
		echo $i
	done

例子2:批量解压缩文件

#!/bin/bash
cd /root/test
ls *.tar.gz > ls.log
for i in $(cat ls.log)
	do
		tar -zxf $i &>/dev/null
	done

4.2 语法二

for (( 初始值; 循环条件; 变量变化 ));do
	程序
done

例子1:

#!/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

五、while循环和until循环

5.1 while循环

while [ 条件判断式 ];do
	语句
done

例子:

#!/bin/bash
# 从1加到100
i=1
s=0
while [ $i -le 100 ];do
	s=$(( $s+$i ))
	i=$(( $i+1 ))
done
echo "The sum is:$s"

5.2 until循环

until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。

#!/bin/bash
i=0
until [[ "$i" -gt 5 ]]    #大于5
do
    let "square=i*i"
    echo "$i * $i = $square"
    let "i++"
done