shell 编程之条件语句
1. 文件测试
1.1 格式
test 条件表达式
或者
[ 条件表达式 ]
1.2 选项
- -d : 测试是否是目录directory
- -e : 测试目录或文件是否存在 exit 。
- -f : 测试是否为文件 file 。
- -r : 测试当前用户是否有权限读取 read。
- -w : 测试当前用户是否有权限写入write 。
- -x : 测试是否设置有可执行excute 权限。
1.3 案例
0
[root@localhost opt]# [ -e data ] && echo "$?"
0
[root@localhost opt]# [ -f data ] && echo "$?"
[root@localhost opt]# [ -r data ] && echo "$?"
0
[root@localhost opt]# [ -w data ] && echo "$?"
0
[root@localhost opt]# [ -x data ] && echo "$?"
0
[root@localhost opt]# test -x data && echo "$?"
0
[root@localhost opt]# test -r data && echo "$?"
0
[root@localhost opt]#
test命令中用于判断文件的选项有很多,从文件个数上分类的话,可以分为单个文件的判断和两个文件之间的比较。其中判断单个文件最常用的选项就是“ -f ”
选项,在比较两个文件时,常用的选项时:
-nt : 判断文件A是否比文件B新。
-ot : 判断文件A是否比文件B旧。
-ef : 判断两文件是否为同一个文件,用来判断两个文件是否指向同一个inode。
[root@localhost opt]# touch a
[root@localhost opt]# touch b
[root@localhost opt]# test a -ot b && echo 1 || echo 0
1
[root@localhost opt]# test a -ef b && echo 1 || echo 0
0
[root@localhost opt]# ln a c
[root@localhost opt]# test a -ef c && echo 1 || echo 0
1
[root@localhost opt]#
2. 整数值比较
注意:必须是整数。
选项
- -eq : 等于 equal
- -ne : 不等于 not equal
- -gt : 大于 greater than
- -lt : 小于 lesser than
- -le : 小于等于 Lesser or equal
- -ge : 大于等于 greater or equal
[root@localhost opt]# [ 3 -gt 5 ]
[root@localhost opt]# echo "$?"
1
[root@localhost opt]# [ 3 -lt 5 ]
[root@localhost opt]# echo "$?"
0
[root@localhost opt]#
[root@localhost opt]# freecc=$(free -m | grep "cache:" | awk '{print $4}')
[root@localhost opt]# [$freecc -lt 1024 ] && echo ${freecc}MB
3. 字符串比较
选项
- = : 等于
- != : 不等于,其中 “ !” 符号表示取反。
- -z : 检查字符串是否为空(zero),对于未定义或赋值空值的变量将视为空串。
[root@localhost opt]# echo $lang
[root@localhost opt]# [ $lang !="en.us" ] && echo "not en.us"
not en.us
[root@localhost opt]# read -p "是否覆盖现有文件(yes/no)?" ack
是否覆盖现有文件(yes/no)?yes
[root@localhost opt]# [ $ack = "no" ] && echo "不覆盖"
[root@localhost opt]# read -p "是否覆盖现有文件(yes/no)?" ack
是否覆盖现有文件(yes/no)?no
[root@localhost opt]# [ $ack = "no" ] && echo "不覆盖"
不覆盖
[root@localhost opt]# read -p "是否覆盖现有文件(yes/no)?" ack
是否覆盖现有文件(yes/no)?yes
[root@localhost opt]# [ $ack = "yes" ] && echo "覆盖"
覆盖
[root@localhost opt]#
4. 逻辑测试
- && : 逻辑与
- || : 逻辑或
- ! : 逻辑否
[root@localhost data]# read -p "请输入一个数字" num
[root@localhost data]# [ $num -gt 5 ]&&[ $num -lt 20 ] && echo "符合"
符合
[root@localhost data]#
5. if 语句
1. 单分支的if
if 条件测试操作
then
命令序列
fi
案例
[root@localhost data]# vim chkfi.sh
#!/bin/bash
if [ "$USER" != "root" ]
then
echo "错误:非root用户,权限不足!"
exit 1
fi
fdisk -l /dev/sda
[root@localhost data]# sh chkfi.sh
磁盘 /dev/sda:322.1 GB, 322122547200 字节,629145600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000afc33
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 516157439 257029120 83 Linux
/dev/sda3 516157440 621015039 52428800 83 Linux
/dev/sda4 621015040 629145599 4065280 5 Extended
/dev/sda5 621017088 629145599 4064256 82 Linux swap / Solaris
[root@localhost data]#
2. 双分支的if语句
if 条件测试操作
then
命令序列1
else
命令序列2
fi
案例
[root@localhost data]# vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is up."
else
echo "host $1 is down."
fi
~
[root@localhost data]# sh pinghost.sh 192.168.100.1
host 192.168.100.1 is up.
[root@localhost data]#
3. 多分支的if语句
if 条件测试操作
then
命令序列1
elif 条件测试操作2
命令序列2
then
命令序列3
elif 条件测试操作3
then
命令序列4
else
命令序列4
fi
石头剪刀布
[root@localhost data]# vim stjd-1.sh
#!/bin/bash
num=$[RANDOM%3]
read -p "请输入1-3的数值,1:石头,2:剪刀,3:布:" person
if [ $num -eq 0 ] && [ $person -eq 3 ]
then
echo "平局"
elif [ $num -eq 1 ] && [ $person -eq 1 ]
then
echo "平局"
elif [ $num -eq 2 ] && [ $person -eq 2 ]
then
echo "平局"
elif [ $num -eq 0 ] && [ $person -eq 1 ]
then
echo "计算机赢"
elif [ $num -eq 1 ] && [ $person -eq 2 ]
then
echo "计算机赢"
elif [ $num -eq 2 ] && [ $person -eq 3 ]
then
echo "计算机赢"
else
echo "你赢"
fi
[root@localhost data]# sh stjd-1.sh
请输入1-3的数值,1:石头,2:剪刀,3:布:2
计算机赢
[root@localhost data]# sh stjd-1.sh
请输入1-3的数值,1:石头,2:剪刀,3:布:1
你赢
[root@localhost data]# sh stjd-1.sh
请输入1-3的数值,1:石头,2:剪刀,3:布:2
平局
[root@localhost data]#