【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令

目录

  • 一、概述
  • [二、test 命令](#二、test 命令)
    • [2.1 test 命令](#2.1 test 命令)
    • [2.2 方括号测试条件](#2.2 方括号测试条件)
    • [2.3 test 命令和测试条件可以判断的 3 类条件](#2.3 test 命令和测试条件可以判断的 3 类条件)
      • [2.3.1 数值比较](#2.3.1 数值比较)
      • [2.3.2 字符串比较](#2.3.2 字符串比较)
  • 三、复合条件测试
  • [四、if-then 的高级特性](#四、if-then 的高级特性)
  • [五、case 命令](#五、case 命令)

一、概述

上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令,判断该命令的结果,但在编程中,我们多数情况需要判断一个变量的值是否为空?判断两个变量的值谁更大?判断变量的字符串是否相等?这些判断条件,使用 if 语句无法直接判断。这篇文章介绍

二、test 命令

2.1 test 命令

if 语句中只能执行该语句后面的命令,并判断命令的退出状态码,而不能判断其他的条件,如:两个值是否相等。如果想要判断两个值是否相等,就需要把这个判断放到一个命令中,再把这个命令放在 if 语句后面去执行,而 test 命令就可以来做这样的判断。

如果 test 命令中列出的条件成立,那么 test 命令就会退出并返回退出状态码 0。

test 命令的格式非常简单:

shell 复制代码
test condition

condition 是 test 命令要测试的一系列参数和值。当用在 if-then 语句中时, test 命令看起来如下所示:

shell 复制代码
if test condition
then
	commands
fi

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

2.2 方括号测试条件

bash shell 提供了另一种条件测试方式,无须在 if-then 语句中写明 test 命令:

shell 复制代码
if [ condition ]
then
	commands
fi

方括号定义了测试条件。
注意,第一个方括号之后和第二个方括号之前 必须 留有空格,否则就会报错。

2.3 test 命令和测试条件可以判断的 3 类条件

test 命令和测试条件可以判断 3 类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

2.3.1 数值比较

使用 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

注意:对于条件测试, bash shell 只能处理整数。

2.3.2 字符串比较

条件测试还允许比较字符串值。下表列出了可用的字符串比较功能

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

注意

  • 在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内
  • 大于号和小于号必须转义(\>\< ),否则 shell 会将其视为重定向符,将字符串值当作文件名。
  • 比较测试中使用的是标准的 Unicode 顺序,根据每个字符的 Unicode 编码值来决定排序结果,结果和 sort 命令不同

三、复合条件测试

if-then 语句允许使用布尔逻辑将测试条件组合起来。可以使用以下两种布尔运算符

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

第一种布尔运算使用布尔运算符 AND 来组合两个条件。要执行 then 部分的命令,两个条件都必须满足。

第二种布尔运算使用 OR 布尔运算符来组合两个条件。如果任意条件为真,那么 then 部分的命令就会执行。

例子:

shell 复制代码
#!/bin/bash
# Testing an AND Boolean compound condition
#
if [ -d $HOME ] && [ -w $HOME/newfile ]
then
echo "The file exists and you can write to it."
#
else
echo "You cannot write to the file."
#
fi

四、if-then 的高级特性

bash shell 还提供了 3 个可在 if-then 语句中使用的高级特性。\

  • 在子 shell 中执行命令的单括号。
  • 用于数学表达式的双括号。
  • 用于高级字符串处理功能的双方括号。

五、case 命令

如果在在一组可能的值中寻找特定值,使用if语句来判断的话,代码会很冗长。shell提供了case命令来解决此类问题。

case 命令会采用列表格式来检查变量的多个值,其格式如下:

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

例子:

shell 复制代码
#!/bin/bash
# Using a short case statement
#
case $USER in
rich | christine)
echo "Welcome $USER"
echo "Please enjoy your visit.";;
barbara | tim)
echo "Hi there, $USER"
echo "We're glad you could join us.";;
testing)
echo "Please log out when done with test.";;
*)
echo "Sorry, you are not allowed here."
esac

如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

相关推荐
q567315232 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花1 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻1 小时前
Linux:认识文件系统
linux·运维·服务器