Shell编程之条件语句
Shell编程之条件语句
目录
一、条件测试
1. 文件测试与整数测试
(1)test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
注:格式2[]前后需留有至少一个空格
(2)文件测试
格式为:[ 操作符 文件或目录 ]
[root@localhost ~]# [ -d /etc/sysconfig ]
[root@localhost ~]# echo $? #返回0表示条件成立
0
[root@localhost ~]# [ -d /etc/sys ]
[root@localhost ~]# echo $? #返回1表示条件不成立
1
[root@localhost ~]# [ -d /etc/sysconfig ] && echo "YES" #逻辑与,“而且”的意思
YES
(3)常用的文件测试操作符
常用文件比较运算符 | 说明 | 示例 |
---|---|---|
-e filename | 如果filename存在,则为真 | [ -e /var/log/syslog ] |
-d filename | 如果filename目录存在,则为真 | [ -d /tmp/mydir ] |
-f filename | 如果filename文件存在,则为真 | [ -f /usr/bin/grep ] |
-L filename | 如果filename符号链接存在,则为真 | [ -L /usr/bin/grep ] |
-r filename | 如果filename可读,则为真 | [ -r /var/log/syslog ] |
-w filename | 如果filename可写,则为真 | [ -w /var/mytmp.txt ] |
-x filename | 如果filename可执行,则为真 | [ -L /usr/bin/grep ] |
filename1 -nt filename2 | 如果filename1比filename2新,则为真 | [ /tmp/install/etc/services -nt /etc/services ] |
filename1 -ot filename2 | 如果filename1比filename2旧,则为真 | [ /tmp/install/etc/services -nt /etc/services ] |
(4)整数值比较
格式为:[ 整数1 操作符 整数2 ]
[root@localhost ~]# who | wc -l
1
[root@localhost ~]# [ $(who | wc -l) -lt 5 ] && echo "<5"
<5
[root@localhost ~]# FreeCC=$(free -m | grep "Mem:" | awk '{print $6}')
[root@localhost ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
606MB
常用的测试操作符 | 说明 |
---|---|
-eq | 等于(equal) |
-ne | 不等于(not equal) |
-gt | 大于(greater than) |
-lt | 小于(lesser than) |
-le | 小于或等于(lesser or equal) |
-ge | 大于或等于(greater or equal) |
2. 字符串测试与逻辑测试
(1)字符串比较
格式1:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:
[ -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 "覆盖"
覆盖
(2)read命令
Linux read命令用于从标准输入读取数值。
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
read常用选项 | 说明 |
---|---|
-a | 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符 |
-d | 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标准 |
-p | 后面跟提示信息,即在输入前打印提示信息 |
-e | 在输入的时候可以使用命令补全功能 |
-n | 后跟一个数字,定义输入文本的长度,很实用 |
-r | 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话\就是个正常的字符了 |
-s | 安静模式,在输入字符时不在屏幕上显示,例如login时输入密码 |
-l | 后面跟秒数,定义输入字符的等待时间 |
-u | 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的 |
二、if语句
1. if语句概述
(1)逻辑测试
格式1:
[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:
命令1 操作符 命令2
(2)常用的测试操作符
常用操作符 | 说明 |
---|---|
-a或&& | 逻辑与,“而且”的意思 |
-o或|| | 逻辑或,“或者”的意思 |
! | 逻辑否 |
[root@localhost ~]# [ -d /etc ] && [ -r /etc ] && echo "you can open it"
you can open it
[root@localhost ~]# [ -d /etc ] || [ -d /home ] && echo "ok"
ok
2. if单分支语句
graph LR
A{if条件测试操作} -->|条件成立 then| B[命令序列]
B -->C[fi结束判断]
A -->|条件不成立| C
D[单分支流程图]
if 条件测试操作
then 命令序列
fi
例如:
#!/bin/bash
read -p "请输入您的数据:" nums
if [ $[nums%2] == 0 ];then
echo "$nums是偶数"
fi
3. if双分支语句
graph LR
A{if条件测试操作} -->|条件成立 then| B[命令序列1]
B -->D[fi结束判断]
A -->|条件不成立 else| C[命令序列2]
C -->D
E[双分支流程图]
if 条件测试操作
then 命令序列1
else 命令序列2
fi
例如:
#!/bin/bash
read -p "请输入您的数据:" nums
if [ $[nums%2] == 0 ];then
echo "$nums是偶数"
else
echo "$nums是奇数"
fi
4. if多分支语句
graph LR
A{if条件测试操作} -->|条件成立 then| B[命令序列1]
B -->F[fi结束判断]
A -->C{elif条件测试操作}
C -->|条件成立 then| D[命令序列2]
D -->F
C -->|条件不成立 else| E[命令序列n]
E -->F
G[多分支流程图]
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
例如:
#!/bin/bash
read -p "请输入您的成绩:" nums
if [ $nums -ge 90 ];then
echo "出去旅游"
elif [ $nums -ge 80 ];then
echo "买个玩具"
elif [ $nums -ge 70 ];then
echo "在家写作业"
elif [ $nums -ge 60 ];then
echo "试卷抄3遍"
else
echo "再报5个班"
fi