本章肯能有点多,但是看完你绝对能够了如指掌
条件测试
■test命令
●测试表达式是否成立,若成立返回O,否则返回其他数值
■test命令格式
格式1: test 条件表达式
格式2:【条件表达式】
■文件测试
●操作符 文件或目录
■常用的测试操作符
-d: | 测试是否为目录(Directory) |
---|---|
-e: | 测试目录或文件是否存在(Exist) |
-f: | 测试是否为文件(File) |
-w: | 测试当前用户是否有权限写入(Write) |
-x: | 测试当前用户是否有权限执行(eXcute) |
-r: | 测试当前用户是否有权限读取(Réead) |
■格式和案列
[操作符] 文件或目录
■常用的测试操作符
[root@localhost~]# [ -d lmedialcdrom ]
[root@localhost~]# echo $?
0
[root@localhost~]# [ -d /medialcdrom/Server ]
[root@localhost~]# echo $?
1
[root@localhost~]# [ -d /dev/cdrom ] && echo "YES"
YES
返回 0 表示条件成立
返回 1 表示条件不成立
&& : 逻辑与,“而且”的意思
■整数值比较
■格式
[ 整数1 操作符 整数2 ]
■常用的测试操作符
-eq: | 等于 (Equal) |
---|---|
-ne: | 不等于 (Not Equal) |
-gt: | 大于 (Greater Than) |
-lt: | 小于 (Lesser Than) |
-le: | 小于或等于 (Lesser or Equal) |
-ge: | 大于或等于 (Greater or Equal) |
■常用的测试操作符举列
用户数是否>5
[root@localhost~]# who | wc -l
7
[root@localhost~]#[ $(who | wc -l) -gt 5 ] && echo "Too many."
Too many.
[root@localhost~]#[ $(who | wc -l) -ge 10 ] && echo "> =10."
用户数是否>=10?
[root@localhost~]# FreeCC=$(free -m | grep "Mem: " | awk '{print $6}')
[root@localhost~]#[ $FreecC -lt 1024 ] && echo ${FreeCC}MB
275MB
空闲内存是否<1024MB?
■字符串比较
■格式
●格式1 |
---|
[ 字符串1 = 字符串2 ] |
[ 字符串1 != 字符串2 ] |
●格式2 |
[ -z 字符串 ] |
■常用的测试操作符
=: | 字符串内容相同 |
---|---|
-z: | 字符串内容为空 |
!=: | 字符串内容不同,!号表示相反的意思 |
■举列
[root@localhost~]# echo $LANG 测试当前语言环境
zh_CN.UTF-8
[root@localhost~]#[ $LANG != "en.US" ] && echo "Not en.US"
Not en.us
[root@localhost-]# read -p“是否覆盖现有文件(yes/no) ? " ACK
是否覆盖现有文件(yes/no)? yes
[root@localhost一]#[ $ACK= "yes" ] && echo "覆盖"
覆盖
测试读入的字符串是否为yes
■逻辑测试
■格式
格式1:
[表达式1] 操作符 [表达式2 ]...
格式2 :
命令1 操作符 命令2...
■常用的测试操作符
-a 或 && : | 逻辑与,“而且”的意思 |
---|---|
-o 或 ll : | 逻辑或,“或者”的意思 |
!: | 逻辑否 |
■举列
[root@localhost opt]# [ -d /etc ]&& [ -r /etc ] && echo "you can open /etc this diretory"
you can open /etc this diretory
[root@localhost opt]# [ -d /etc ]|| [ -d /home ]&& echo "ok"
ok
[root@localhost opt]# [ -r /etc ]|| [ -d /home ]&& echo "ok"
ok
[root@localhost opt]# [ -r /etc ]|| [ -r /home ]&& echo "ok"
ok
[root@localhost opt]# [ -f /etc ]|| [ -f /home ]&& echo "ok"
[root@localhost opt]# echo $?
1
[root@localhost opt]# [ ! -f /etc ]|| [ -f /home ]&& echo "ok"
ok
if语句的结构
■if单分支结构
使用方法
[root@localhost opt]# vi chkdir.sh
#!/bin/bash
MOUNT_DIR="/opt/cdrom"
if [ ! -d $MOUNT_DIR ]
then
echo "创建 "$MOUNT_DIR”>>/opt/1.txt
echo "创建$MOUNT_DIR"
mkdir -p $MOUNT
■if双分支结构
使用方法
使用if多分支去ping一下
[root@localhost shell]# vi if2.sh
ping -c 3 -i 0.2 -W 3 $1 &> /opt/10.txt
if [ $? -eq 0 ]
then
echo "可ping通"
else
echo "状态不通"
fi
-c 指定发送几个包
-i 间隔几秒
-W 超时几秒
$? 上一次命令执行后返回的状态,如果为0则成功,为其他则失败
$1 位置参数 ping$1 参数发送三个包,间隔0.2秒,超时3秒
如果ping的是通的,则打印可ping通,
如果不能通,则打印状态不通
验证
[root@localhost shell]# ./if2.sh 20.0.0.10
状态不通
[root@localhost shell]# ./if2.sh 20.0.0.2
可ping通
我这里用的是NAT虚拟机网卡,网关为20.0.0.2
■if多分支
使用方法
[root@localhost shell]# vi if2.sh
#!/bin/bash
read -p "请输入您的分数(0-100): " A read:把你输入的值,附加给A使用
if [ $A -ge 85 ] && [ $A -le 100 ]
then
echo "$A分,优秀"
elif [ $A -ge 70 ] && [ $A -le 84 ]
then
echo "$A分,合格"
elif [ $A -ge 0 ] && [ $A -le 69 ]
then
echo "$A分,不合格"
else
echo "请输入正确的数字,否则无效"
fi
验证
[root@localhost shell]# ./if2.sh
请输入您的分数(0-100): 90
90分,优秀
[root@localhost shell]# ./if2.sh
请输入您的分数(0-100): 30
30分,不合格
[root@localhost shell]# ./if2.sh
请输入您的分数(0-100): 84
84分,合格
[root@localhost shell]# ./if2.sh
请输入您的分数(0-100): x
请输入正确的数字,否则无效
[root@localhost shell]
■case多分支
使用方法
[root@localhost ~]# vi 2.sh
read -p "输入一个字符,并按回车键确认: " KEY
case "$KEY" in
[a-z]|[A-Z])
echo 您输入的是字母
;;
[0-9])
echo 输的是数字
;;
*)
echo 输入的是其他
esac
[root@localhost shell]# ./if2.sh
输入一个字符,可以是[A-Z]或[0-9],回车确认:a
您输入的是字母
[root@localhost shell]# ./if2.sh
输入一个字符,可以是[A-Z]或[0-9],回车确认:3
您输入的是数字
[root@localhost shell]# ./if2.sh
输入一个字符,可以是[A-Z]或[0-9],回车确认:
输入的是其他
最后给大家科普一个反撇号(
)
反撇号主要用于命令替换,允许讲执行某个命令的屏幕输出结果复制给变量,反撇号括起来的范围必须是能够执行的命令行,否则会出错