shell 编程之条件语句

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]# 


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42099301/article/details/107401266