AUTHOR:闫小雨
TIME:2024-05-09
目录
一、条件测试操作
$?(预定义变量)
- Shell环境可以根基条件执行后的返回状态值
$?
来判断是否执行成功,当返回0
时表示执行成功,否则(非0值
)时表示执行失败或异常。
test 条件表达式
或[ 条件表达式 ]
比较常用的条件操作包括文件测试、整数值比较、字符串比较,以及针对多个条件的逻辑测试。
- 使用专门的测试工具
test
命令,可以对特定条件进行测试,并且根据返回状态值来进行判断条件是否成立,返回值为0时表示条件成立,否则(非0值
)时表示条件不成立。 - 使用
[ ]
方式与作用和使用test命令一样,但是使用[ ]
需要注意方括号[
或]
与条件表达式之间需要至少一个空格进行分隔。
1、文件测试
文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行。
使用方法:将测试对象放在操作选项之后即可。
-e
即Exist,测试目录或文件是否存在。例如:-e /需要查询的目录或文件地址
-d
即Directory,测试目标是否为目录。例如:-d /需要查询的目录地址
-f
即File,测试目标是否为文件。例如:-f /需要查询的文件地址
-r
即Read,测试当前用户是否有权限读取。-w
即Write,测试当前用户是否有权限写入。-x
即Excute,测试是否设置有可执行权限。
为了更直观地查看测试结果,可以结合命令分隔符&&
和echo
命令一起使用,当条件成立时直接输出“YES"。其中,"&&
”符号表示“而且”的关系,只有当前面的命令执行成功后才会执行后面的命令,否则后面的命令将会被忽略不被执行。
2、整数值比较
整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。
使用方法:使用时将操作选项放在要比较的两个整数之间。
-eq
即(Equal)等于,第一个数等于(=)第二个数。-ne
即(Not Equal)不等于,第一个数不等于(!=)第二个数。-gt
即(Greater Than)大于,第一个数大于(>)第二个数。-ge
即(Greater or Equal)大于等于,第一个数大于等于(>=)第二个数。-lt
即(Lesser Than)小于,第一个数小于(<)第二个数。-le
即(Lesser or Equal)小于等于,第一个数小于等于(<=)第二个数。
例如:
[root@yanxy502 ~] Unum=`who | wc -l` #查看当前用户数量,并赋值Unum
[root@yanxy502 ~] [ $Unum -gt 1 ] && echo "有$Unum个人登录着" #比较Unum大于1,就输出有Unum个人登录着
3、字符串比较
字符串比较通常用来检查用户输入、系统环境等是否满足条件,也可用来判断用户输入的位置参数是否符合要求。
=
:第一个字符串与第二个字符串是否相同。!=
:第一个字符串与第二个字符串是否不相同,其中“!
”符号表示取反。-z
:检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。
例如:
[root@yanxy502 ~] [ 'nihao' = 'hello' ] #比较第一个nihao与hello相同
[root@yanxy502 ~] echo $?
1 #返回为 1 ,表示不相同
[root@yanxy502 ~] [ 'nihao' != 'hello' ] #比较第一个nihao与hello不相同
[root@yanxy502 ~] echo $?
0 #返回为 0 ,表示不相同
例如2:
[root@yanxy502 ~] read -p "是否删除当前文件(yes/no)?" delete
是否删除当前文件(yes/no)? yes
[root@yanxy502 ~] [ $delete = "yes" ] && echo "已删除"
已删除
[root@yanxy502 ~] read -p "是否更改当前文件(yes/no)?" change
是否更改当前文件(yes/no)? no
[root@yanxy502 ~] [ $change = "no" ] && echo "不覆盖"
不覆盖
4、逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况。
使用方法:使用时放在不同的测试语句或命令之间。
&&
:逻辑与,表示"而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0(结果成立)。
-
- 使用test命令测试时,"
&&
"可改为"-a
"
- 使用test命令测试时,"
||
:逻辑或,表示"或者",只要前后两个条件中有一个成立,整个测试命令的返回值即为0(结果成立)。
-
- 使用test命令测试时,"
||
"可改为“-o
"。
- 使用test命令测试时,"
!
:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为 0(结果成立)。
二、if条件语句
if语句是一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果…那么……)。
1、单分支if语句
单if分支:只有一个if条件判断,满足条件则执行相应的代码块,不满足则不执行。
if [ 条件判断式 ]; then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
#!/bin/bash
#时间:2024-5-9
#作者:闫小雨
#描述:if单分支语句示例,判断目录是否存在
read -p "请输入需要判断的目录:" name
if [ ! -d $name ]
then
echo "$name目录不存在,正在创建..."
mkdir -p $name
echo "$name目录创建完成."
fi
echo "$name目录已存在,正在退出..."
2、双分支if语句
双if分支:包含一个if条件判断和一个else条件判断,满足if条件执行一个代码块,不满足则执行else后的代码块。
if [ 条件判断式 ]; then
条件成立时,执行的程序
else
条件不成立时,执行的程序
fi
或者
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的程序
fi
举例:
#!/bin/bash
#时间:2024-5-9
#作者:闫小雨
read -p '请输入文件名,例如 /root/test.txt:' filename
if [ -f $filename ];
then echo '这是一个普通文件'
else echo '你输入的文件名称有问题,重启程序后请重新输入一个文件'
fi
3、多分支if语句
多if分支:(也称为if-elif-else分支):包含多个if或elif条件判断,以及一个可选的else条件判断。根据条件的不同,会执行与第一个为真的条件相对应的代码块,如果没有条件为真,则执行else后的代码块(如果存在的话)。
if [ 条件判断式1 ]; then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]; then
当条件判断式2成立时,执行程序2
.....省略更多条件.....
else
当所有条件都不成立时,最后执行此程序
fi
举例1:
#!/bin/bash
#时间:2024-5-9
#作者:闫小雨
#描述:Dome娶老婆条件
read -p "请输入你有多少钱: " money
read -p "请输入你有几套房子: " houses
if [ $money -ge 1000000 ] #-ge 表示大于
then echo "我就嫁给你"
elif [ $houses -ge 3 ]
then echo "我也嫁给你"
else echo "我考虑下"
fi
举例2:
#!/bin/bash
#时间:2024-5-9
#作者:闫小雨
NO=20
echo '猜数字游戏'
while true
do
read -p "请输入一个正整数来开始游戏: " num
if ! [[ "$num" =~ ^[0-9]+$ ]]; then # 添加输入验证,确保输入的是正整数
echo "请输入一个正整数!"
continue # 如果输入不是正整数,则继续循环
fi
if [ $NO -gt $num ]; then # 判断输入的数字和原始数字的大小,gt表示大于
echo "你猜测的太小了"
elif [ $NO -lt $num ]; then # 判断输入的数字和原始数字的大小,lt表示小于
echo "你猜测的太大了"
else
echo "恭喜你猜对了"
break # 如果猜对了,则退出循环
fi
done