如何在bash中使用条件语句

今天我们介绍一下如何在 bash 中使用条件语句。
在 bash 中使用 if 语句
在绝大多数编程语言中,if 语句都是最基本的条件语句。在 bash 中其语法如下:
if [ condition ]; then your codefiif 语句以 fi(与if相反)结束。
注意空格:
在开始括号之后,与结束括号之前,都必须要有一个空格,否则 shell 将报错;条件运算符(=,==,<=等)前后必须有空格,否则将报错。我们创建一个示例脚本 root.sh,当你以 root 身份运行该脚本的时候,才会进入 if 语句:
#!/bin/bashif [ $(whoami) = 'root' ]; then echo you are rootfiwhoami 命令输出当前用户名。在 bash 变量教程中,我们介绍了 $(command) 结构的语法用于命令替换。
所以,当你以 root 用户身份登录时,条件 $(whoami) = 'root' 才为真。
if-else 语句
上述代码中,如果当前用户不是 root,将看不到任何输出。当 if 条件为 false 的时候,需要将其执行的代码放到 else 语句中,如下所示:
#!/bin/bashif [ $(whoami) = 'root' ]; then echo you are rootelse echo you are not rootfi此时,当你以普通用户运行脚本的时候,会输出 you are not root,如下所示:
$ ./root.shyou are not root使用 else if 语句
当有多个表达式(条件)时,可以使用 elif(else-if)语句。看下面的例子,我们创建一个名为 age.sh 的脚本:
#!/bin/bashage=$1if [ $age -lt 13 ]; then echo you are a kid.elif [ $age -lt 20 ]; then echo you are a teenager.elif [ $age -lt 65 ]; then echo you are an adult.else echo you are an elder.fi上述代码中的 -lt 即小于(less than)。在前面的文章中我们介绍过如何给 bash 脚本传递参数,现在我们运行一下 age.sh,并传递不同的参数:
$ ./age.sh 11you are a kid.$ ./age.sh 18you are a teenager.$ ./age.sh 44you are an adult.$ ./age.sh 70you are an elder.需要注意的是,在条件语句中,可以有多个 elif ,但是只能有一个 else,且必须使用 fi 关闭。
在 bash 中嵌套使用 if 语句
if 语句可以嵌套使用。看如下 weather.sh 脚本:
#!/bin/bashtemp=$1if [ $temp -gt 5 ]; then if [ $temp -lt 15 ]; then echo the weather is cold. elif [ $temp -lt 25 ]; then echo the weather is nice. else echo the weather is hot. fielse echo it's freezing outside ...fi上述脚本接受温度作为参数,然后显示一条反应天气情况的信息。当温度大于 5 度的时候,就会进入嵌套的 if 语句。我们运行一下该脚本:
$ ./weather.sh 0it's freezing outside ...$ ./weather.sh 8the weather is cold.$ ./weather.sh 16the weather is nice.$ ./weather.sh 30the weather is hot.在 bash 中使用 case 语句
我们还可以在 bash 中使用 case 语句来替换多个 if 语句,其构造的一般语法如下:
case variable inpattern1 )command … ;;pattern2 )command … ;;pattern2 )command … ;;esac注意:
条件语句最后总会包含一个空格和右括号 );条件语句后的命令以两个分号 ;; 结束,其前面的空格可有可没有;case 语句 以 esac 结尾(与 case 相反)。case 语句在处理模式匹配或正则表达式的时候特别有用。作为演示,我们创建一个名为 char.sh 的脚本:
#!/bin/bashchar=$1case $char in[a-z])echo small alphabet. ;;[a-z])echo big alphabet. ;;[0-9])echo number. ;;*)echo special character.esac上述脚本接受一个字符作为参数,并显示该字符是大写字母,还是小写字母、数字还是特殊字符。
$ ./char.sh asmall alphabet.$ ./char.sh zbig alphabet.$ ./char.sh 7number.$ ./char.sh $special character.上述脚本中我使用了通配符 * 来定义默认字符,它相当于 if 语句中的 else 语句。
bash 中的测试条件
有许多测试条件可以与 if 语句一起使用。如果使用数字、字符串或文件,测试条件会有所不同。将它们视为bash中的逻辑运算符。
下表列出一些最常用的测试条件:
条件相当于
a -ltb **a **b
a -leb **a =**b
a -eqb a 等于b
a -neb a 不等于b
-e**file **file 存在
-d**file **file 存在且是一个目录.
-f**file **file 存在且是一个常规文件.
-l**file **file 存在且是一个软链接.
**string1 =**string2 string1 等于string2
**string1 !=**string2 string1 不等于string2
-z**string1 **string1 是空的
上面这些测试条件不需要专门记,可以在 man 手册中查看:
$ man test我们创建一个名为 filetype.sh 的脚本,用来检查文件是常规文件、目录还是软链接:
#!/bin/bashif [ $# -ne 1 ]; then echo error: invalid number of arguments exit 1fifile=$1if [ -f $file ]; then echo $file is a regular file.elif [ -l $file ]; then echo $file is a soft link.elif [ -d $file ]; then echo $file is a directory.else echo $file does not existfi在脚本的开始,我们检查一下参数的数量,如果没有参数或者有多个参数,脚本会输出一条消息并退出。下面是运行情况:
$ ./filetype.sh weather.shweather.sh is a regular file.$ ./filetype.sh /bin/bin is a soft link.$ ./filetype.sh /var/var is a directory.$ ./filetype.sh error: invalid number of arguments在同一行中编写 if else 语句
到目前为止,我们上述代码都是在规范的缩进格式下写的,这是一种规范的写法,但并不是非这样写不可。
当你只想在 shell 中看到结果时,可以在单行中使用 if else 语句。
假设我们有如下脚本:
if [ $(whoami) = 'root' ]; then echo you are rootelse echo you are not rootfi可以在一行代码中这样写:
if [ $(whoami) = 'root' ]; then echo root; else echo not root; fi大家可以运行一下上面的脚本,看看结果。
基本上,就是在命令结束后添加分号 ; ,然后写下一条语句。

通过人工智能对机器人的形状进行仿真
温控开关寿命测试仪系统电路设计
Micro LED成台厂抗衡OLED的最大筹码
如何申请升级鸿蒙系统
PMOS防反接电路解析
如何在bash中使用条件语句
智能门锁想要走出自己的康庄大道 势必要经历行业的改革阵痛期
北京君正发布2020年度报告称,公司实现营业收入为21.7亿元
你想知道区块链的原理是什么吗
2023年人工智能未来的五大趋势
Aeroflex推出新一代高性能触摸屏版信号源产品系列
全方位对比STM32单片机和51单片机
绘王2019旗舰版Kamvas Pro 22数位屏七月焕新升级
智慧园区管理系统的开发是智慧城市建设的基础
南方电网正在全面推进粤港澳大湾区致力打造世界一流智能电网
工程师选择物联网管理软件时需要了解的通信协议
磷酸铁锂作为锂离子电池的正极材料
数据采集模块如何选择 振弦式传感器读数模块VM501 604 608 704S
诚迈科技智能座舱EX5.0软件平台
如何在监视器或电视上显示树莓派