shell 脚本——判断条件

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

在之前的shell语言学习笔记中已经写过shell的几种判断语句及循环语句,也简单的介绍了shell语言判断语句和判断条件。在此再做进一步学习。

test命令的测试功能

test命令用于检测系统文件及其相关属性,如检查某文件是否存在,检查某文件的权限等。判断当前目录下是否存在某文件study可以用以下命令:

1
#test -e study

-e 选项是测试某文件是否存在(包括文件和文件夹),该执行结果不会输出任何信息,但是我们可以通过&&及||来改写使其展现相关信息,改写后的命令如下:

1
#test -e study && echo "exist!" || echo "not exist!"

该命令的作用就是当study文件存在时就输出字符串”exist!”,当不存在时就输出字符串”not exist!”

以下是test命令常用的测试标志:

1. 某文件名的类型检测(存在与否及文件类型)(test -e filename)

-e :该“文件名”是否存在。
-d :该文件名是否为目录。
-f  :该文件名是否为普通文件。
b,c,S,p,L分别指的是块设备、字符设备、套接字文件、管道文件及链接文件。

2. 文件权限的检测(test -r filename)

-r :该文件是否具有可读属性
-w :该文件是否具有可写属性
-x :该文件是否具有可执行属性
-s  :该文件是否为非空白文件

3. 比较两个文件(test file_a nt file_b)

-nt :文件file_a是否比file_b新
-ot :文件file_a是否比file_b旧
-ef :判断两个文件是否为同一文件,可用于判断硬连接。(主要判断两个文件是否均指向同一个inode)

4. 两个整数之间的判断(test n1 -eq n2)

-eq :两个数相等(equal)
-ne :两个数不相等(not equal)
-gt :前者大于后者(greater than)
-lt :前者小于后者(less than)
-ge :前者大于等后者
-le :前者小于等于后者

5. 判断字符串

test -z str :判断字符串是否为空,若为空则回传true
test -n str :判断字符串是否为非空,左路为非空则回传true(-n亦可省略)
test str_a = str_b及test str_a != str_b:判断两字条串是否相等及不相等。

6. 多重判断条件(test -r file -a -w file)

-a :and,当两个条件都满足时才回传true,即file具有读和写权限
-o : or,当两个条件满足其一时即回传true
-! :条件求反,test -! -x file,即当file不具有执行权限时才回传true

下面是两个简单的shell脚本,判断其功能:

1
2
3
4
#!/bin/bash
echo "Please input a filename:"
read -e  filename
(test -e $filename && (test -d $filename && echo "directory" ||( test -f $filename && echo "regular")) )||echo "$filename does not exist"
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
echo -e "The program will show you that filename is exist which input by you."
read -p "Input a filename:" filename
test -z $filename && echo "You must input a filename." && exit 0
test ! -e $filename && echo "The filename $filename DO NOT exist" && exit 0
test -f $filename && filetype="Regulare file"
test -d $filename && filetype="directory";
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo "The filename:$filename is a $filetype"
echo "And the permission are:$perm"

使用判断符号[ ]

可以使用判断符号进行数据的判断,如检查某变量是否为空 [ -z $SHELL ],需要注意的是中括号(“[]”)内的组件必须以空格隔开。有以下脚本:

1
2
3
4
5
#!/bin/bash
read -p "input you choice:" choice
[ "$choice" == "y" ] || [ "$choice" == "Y" ] && echo "OK,continue" && exit 0
[ "$choice" == "n" ] || [ "$choice" == "N" ] && echo "Oh,interrupt!" && exit 0
echo "I don't know what is your choice" && exit 0

注:这些内容是参考的《鸟哥的Linux私房菜》一书中的部分章节。

 

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:((”$a” > “$b”))
>= 大于等于(需要双括号),如:((”$a” >= “$b”))

字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以”z”开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" /< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" /> "$b" ]
注意:在[]结构中”>”需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为”null”.就是长度为0.
-n 字符串不为”null”
注意:
使用-n在[]结构中测试必须要用”"把变量引起来.使用一个未被”"的字符串来使用! -z
或者就是未用”"引用的字符串本身,放到[]结构中。虽然一般情况下可
以工作,但这是不安全的.习惯于使用”"来测试字符串是一种好习惯.

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:((”$a” > “$b”))
>= 大于等于(需要双括号),如:((”$a” >= “$b”))

字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以”z”开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" /< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" /> "$b" ]
注意:在[]结构中”>”需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为”null”.就是长度为0.
-n 字符串不为”null”
注意:
使用-n在[]结构中测试必须要用”"把变量引起来.使用一个未被”"的字符串来使用! -z
或者就是未用”"引用的字符串本身,放到[]结构中。虽然一般情况下可
以工作,但这是不安全的.习惯于使用”"来测试字符串是一种好习惯.

 

shell中条件判断if中的-z到-d的意思

[ -a FILE ] 如果 FILE 存在则为真。

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。

[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。

[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。

[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为0则为真。

[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。

[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。

[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。

[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。

[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。

[ -z STRING ] “STRING” 的长度为零则为真。

[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。

[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。

[ STRING1 != STRING2 ] 如果字符串不相等则为真。

[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。

[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。

[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

UniApp消息推送进阶:不用插件实现动态语音播报(含保活策略) 本文详细介绍了在UniApp中实现动态语音播报的进阶方案,无需依赖第三方插件。核心采用透传消息传递动态数据,结合本地TTS引擎合成语音,并针对不同安卓厂商提供了深度通道配置与差异化保活策略,有效解决了App退至后台或被清理后语音播报失效的难题。 阅读详情

相关推荐

Modbus CRC和LRC算法研究及代码实现

一、CRC(循环冗余校验) 1 CRC16实现流程 XOR = 异或 N = 字节的信息位 POLY = CRC16 多项式计算 = 1010 0000 0000 0001 (生成多项式 = 1 + x2 + x15 + x16) 在CRC16中,发送的第一个字节位低字节 2 CRC16实例推导 3 CRC16代码实现 unsigned short CRC16(unsigned char *a...

Hi, Boy 2880

shell 本学习之判断条件

在之前的shell语言学习笔记中已经写过shell的几种判断语句及循环语句,也简单的介绍了shell语言判断语句和判断条件。在此再做进一步学习。 test命令的测试功能 test命令用于检测系统文件及其相关属性,如检查某文件是否存在,检查某文件的权限等。判断当前目录下是否存在某文件study可以用以下命令: 1 #test -e study

琉璃BES 6085

Hypack 应用于地形测量的高级设置操作要领

Hypack 是业界公认最好的水文导航测量软件,是目前世界上应用广泛的专业测量疏浚软件。它能够接收,处理,存储和输出各种数据。Hypack支持绝大部分GPS,测深仪(国内如海鹰HY1603单波束测沙仪),多波束测深仪,旁扫声纳,涌浪补偿器,水位仪,验潮仪以及声速剖面仪。利用 Hypack 可以进行导航,单波束测量,多波束测量,旁扫测量以及疏浚实时监测等。软件界面友好,使用方便。本文简要阐述Hypack 应用于地形测量的几个重要操作要领。

中游鱼的博客 2722

shell本编程-基础篇

在实习的时候用到了shell本,并且在面试中手撕代码时也让写过本,所以系统的学习了一下shell编程基础,对本编程的基础有了一些了解,主要源于bilibili上的视频,有些地方加了一些自己的理解和代码。 第1章 shell概述 shell就是一个用户与操作系统交互的解释器,接收用户命令,然后调用操作系统。shell还是一门本编程语言,我们可以使用它编写本完成很多操作。 Linux提供的shell解析器有很多,可以使用cat /etc/shells命令查看,centos和Ubuntu的默认解析器都是

小峰的博客 1036

Shell本编写

Linux学习

qq_44858712的博客 804

华为H12-611 题库部分题详解

HCIA-openEuler V1.0 华为认证openEuler工程师部分 题库H12-611

m0_54149707的博客 5797

Shell条件判断

基本语法 [ condition ] 注意: 条件非空即为true,[ mubai ]返回true,[] 返回false; condition前后要有空格; 常用判断条件 两个整数之间比较 = 字符串比较 -lt 小于(less than) -le 小于等于(less equal) -eq 等于(equal) -gt 大于(greater than) -ge 大于等于(greater equal)...

weixin_38932035的博客 589

shell本——条件判断

shell条件判断条件判断语法格式条件判断相关参数判断文件类型实例判断文件权限判断文件新旧判断整数实例判断字符串多重条件判断实例逻辑运算符总结 条件判断语法格式 格式1: test 条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] 支持正则 =~ 注意 [ ] 和 [[ ]] 两边必须有空格 条件判断相关参数 判断文件类型 判断参数 含义 -e 判断文件是否存在(任何类型文件) -f 判断文件是否存在并且是一个普通文件 -d 判断文件是否存在并且是一个目

Cantevenl的博客 4077

shell判断false_shell 本——判断条件

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.整数比较-eq 等于,如:if [ "$a" -eq "$b" ]-ne 不等于,如:if [ "$a" -ne "$b" ]-gt 大于,如:if [ "$a" -gt "$b" ]-ge 大于等于,如:if [ "$a" -ge "$b" ]-lt 小于,如:if [ "$a" -lt "$b" ]-le 小于等于,如:if [ "...

weixin_39799825的博客 295

shell 判断返回值_Shell本——条件测试操作

Shell本应用——条件测试操作前言:在简单的shell本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程,这就使得本过于机械化,不够"智能",难以处理更加灵活的系统任务。下面让我们一起了解如何进行条件测试操作,并通过正确使用if语句,使shell本具有一定的"判断"能力,以根据不同的条件来完成不同的管理任务。条件测试操作要是shell本程序具备一定的"智能",面临的第一...

weixin_29825411的博客 5094

shell本——流程控制之条件判断

本文介绍了三个Linux系统管理本的实现方法:1.磁盘空间监控本,通过检查剩余空间(低于20G时发送QQ邮件报警),包含邮箱配置、SSL证书设置和定时任务;2.Web服务状态检测本,通过进程或端口判断Nginx运行状态,未运行时自动安装并配置防火墙规则;3.Web服务访问测试本,使用curl命令检测服务可用性,正常返回运行状态,异常时退出码12。每个方案均包含详细配置步骤和测试方法,涵盖邮件告警、服务管理、网络检测等系统管理场景。

m0_75156059的博客 598

makefile ifneq多个判断条件_Shell本——条件测试操作

Shell本应用——条件测试操作前言:在简单的shell本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程,这就使得本过于机械化,不够"智能",难以处理更加灵活的系统任务。下面让我们一起了解如何进行条件测试操作,并通过正确使用if语句,使shell本具有一定的"判断"能力,以根据不同的条件来完成不同的管理任务。条件测试操作要是shell本程序具备一定的"智能",面临的第一...

weixin_39689622的博客 497

shell本——流程控制之条件判断(1)

shell本——流程控制之条件判断

2401_82445924的博客 319

Shell本——条件语句

shell本——编程条件语句(条件测试、if语句、case分支语句)一、条件测试1.1 Test命令1.2 文件测试1.3整数值比较1.4字符串比较1.5逻辑测试二、if语句2.1 单分支结构2.2双分支结构2.3多分支结构 一、条件测试 1.1 Test命令 测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值 。 格式1:test 条件表达式 格式2:[ 条件表达式 ] 1.2 文件测试 [ 操作符 文件或目录 ] 常用操作符 说明 -d 测试是否为目录(D

Kiro君的博客 1807

Shell本——if条件总结

Shell本——if条件总结基本语法If [ command ]; then       符合该条件执行的语句fi if [ command ]; then       符合该条件执行的语句elif [ command ]; then       符合该条件执行的语句else       符合该条件执行的语句fi 使用简单举例:#! /bin/bash count=7if [ $count -g...

没有最好,只有更好! 650

shell本——循环语句

shell本——编程之循环语句(for、while、until) -n 表示输出不换行 -E 禁止反斜杠转义,与-e参数功能相反 -e 输出转义字符,将转义后的内容输出到屏幕上 \b 相当于退格键,但前提是“\b”后存在字符;“\b"表示删除前一个字符;”

Kiro君的博客 6740

shell本——变量定义

变量的定义变量如何定义变量的定义规则变量名区分大小写变量名不能有特殊符号变量名不能以数字开头等号两边不能有任何空格变量的定义方式基本方式命令执行结果赋值给变量交互式定义变量(read)实例定义有类型的变量(declare)实例变量的分类本地变量环境变量全局变量系统变量实例 变量如何定义 变量是用来临时保存数据的,该数据是可以变化的数据 变量名=变量值 变量名:用来临时保存数据的 变量值:就是临时的可变化的数据 [root@maomao ~]# A=hello 定义变量A [root@maomao

Cantevenl的博客 1万+

shell本——判断语句

if的基本语法 if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi if的特殊用法 [ commend ] 里面的命令一定都需要空格分割开 (1)针对文件 if [ -f file ] 如果文件存在 if [ -e file ] 如果文件存在 if [ -d … ] 如果目录存在 if [ -s file ] 如果文件存在且非空 if [ -r f

weixin_42963375的博客 1868

shell本——if语句

if语句的结构和使用 在简单的Shell本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程。 然而,单一的顺序结构使得本过于机械化,不够“智能”,难以处理更加灵活的系统任务。 本章将学习如何进行条件测试操作,并通过正确使用if语句,使Shell本具有一定的“判断“ 能力,以根据不同的条件来完成不同的管理任务。 整数比较 -eq 等于,如:if [ “a"−eq"a" -eq "a"−eq"b” ] -ne 不等于,如:if [ “a"−ne"a" -ne "a"

weixin_46017843的博客 1万+

Linux shell本——if运算例子

下面以具体例子来描述shell本中if语句的使用 #!/bin/sh #define a variable,定义一个变量,此处等号两边不能有空格 v="test shell commond" #print the variable,且没有连字符也是支持的 echo "变量 is: " $v #判断当前目录下是否有此文件 file="test.sh" #定义要查找

ShanDong_Chu 2万+
上一篇: centos7的修改ulimit
下一篇: php数据库操作封装类
free_xiaochen
码龄11年 21粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值