13.bash shell中的if-then语句

文章目录


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


shell中的流控制if语句

简单的脚本可以只包含顺序执行的命令,但结构化命令允许根据条件改变程序执行的顺序。

if语句

if-then语句

if-then语句格式如下:

sh 复制代码
if command
then
    commands
fi

在其他编程语言中, if 语句之后的对象是一个等式,这个等式的求值结果为 TRUEFALSEbash shellif 语句会运行 if 后面的那个命令。如果该命令的退出状态码是0,位于 then 部分的命令就会被执行。

sh 复制代码
#!/bin/bash
if pwd
then
        echo "pwd worked"
fi

输出:

sh 复制代码
# rob@xx-rob:~$ ./test1
/home/rob
pwd worked

if-then-else 语句

格式:

sh 复制代码
if command
then
    commands
else
    commands
fi

示例:

sh 复制代码
v=bin
if grep $v pwd
then
	echo "pwd worked"
else
	echo "cannot find $v"
fi

结果:

sh 复制代码
rob@xx-rob:~$ ./test1
# grep: pwd: 没有那个文件或目录
# cannot find bin

if还可以嵌套多层:

sh 复制代码
if command1
then
command set 1
elif command2
then
command set 2
elif command3
then
command set 3
elif command4
then
command set 4
fi

test命令

bash shell if语句的条件是command,如果要使用常规的数值/字符串比较条件,需要使用test命令。

使用test命令的if-then-fi语句:

sh 复制代码
if test condition
then
commands
fi

如果不写 test 命令的condition部分,它会以非零的退出状态码退出,并执行 else语句块。

加入条件时,test 命令会测试该条件。

bash shelltest命令的另外一种写法是使用[ condition ] 中括号,第一个方括号之后和第二个方括号之前必须加上一个空格,

否则就会报错。

if中条件判断的几个条件:

  • 判断变量是否有值if test ${variable}
  • 数值比较
  • 字符串比较
  • 文件比较

数值比较

test命令的数值比较功能:

比较 描述
n1 -eq n2 检查 n1 是否与 n2 相等
n1 -ge n2 检查 n1 是否大于或等于 n2
n1 -gt n2 检查 n1 是否大于 n2
n1 -le n2 检查 n1 是否小于或等于 n2
n1 -lt n2 检查 n1 是否小于 n2
n1 -ne n2 检查 n1 是否不等于 n2
sh 复制代码
#!/bin/bash
if test 100 -le 145; then
	echo "100 is smaller than 145"
fi

v=12
if [ $v -eq 12 ];then
	echo "value is 12"
fi

bash shell只能处理整数,不能使用浮点数作为判断条件。

字符串比较

bash shell条件测试还允许比较字符串值,比较字符串比较烦琐。

比较 描述
str1 = str2 检查 str1 是否和 str2 相同
str1 != str2 检查 str1 是否和 str2 不同
str1 < str2 检查 str1 是否比 str2 小
str1 > str2 检查 str1 是否比 str2 大
-n str1 检查 str1 的长度是否非0
-z str1 检查 str1 的长度是否为0

bash sehll中比较运算符需要使用转义,否则会被当成重定向运算符。

sh 复制代码
s1="val"
s2="thi"

# 升成`thi`的文件
if [ $s1 > $s2 ];
then
    echo "new file $v2 has been created."
fi

if [ $s1 \> $s2 ];
then
    echo "$s1 is greater than $s2."
fi

比较测试中使用的是标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果。在比较测试中,大写字母被认为是小于小写字母的。

文件比较

测试Linux文件系统上文件和目录的状态。

命令 描述
-d file 检查 file 是否存在并是一个目录
-e file 检查 file 是否存在
-f file 检查 file 是否存在并是一个文件
-r file 检查 file 是否存在并可读
-s file 检查 file 是否存在并非空
-w file 检查 file 是否存在并可写
-x file 检查 file 是否存在并可执行
-O file 检查 file 是否存在并属当前用户所有
-G file 检查 file 是否存在并且默认组与当前用户相同
file1 -nt file2 检查 file1 是否比 file2 新
file1 -ot file2 检查 file1 是否比 file2 旧

if-then 语句允许你使用布尔逻辑来组合测试,有两种布尔运算符可用:

  • [ condition1 ] && [ condition2 ]
  • [ condition1 ] || [ condition2 ]

case语句

在尝试计算一个变量的值,在一组可能的值中寻找特定值,可能不得不写出很长的 if-then-else语句。case

令会采用列表格式来检查单个变量的多个值。

sh 复制代码
case variable in
    pattern1 | pattern2) commands1;;
    pattern3) commands2;;
    *) default commands;;
esac

一个例子:

sh 复制代码
c=1
case $c in
1 | 2) echo "1";;
3) echo "23";;
esac

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


相关推荐
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程4 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk5 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*5 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue5 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man5 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang