shell脚本--条件判断参数

参考链接:https://blog.youkuaiyun.com/yyywyr/article/details/50285251
https://blog.youkuaiyun.com/Cantevenl/article/details/115263888

条件判断语法格式

格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: [[ 条件表达式 ]] 支持正则 =~
注意:
[ ] 和 [[ ]] 两边必须有空格

条件判断相关参数

判断文件类型

判断参数含义
-e判断文件是否存在(任何类型文件)
-f判断文件是否存在并且是一个普通文件
-d判断文件是否存在并且是一个目录
-L判断文件是否存在并且是一个软连接文件
-b判断文件是否存在并且是一个块设备文件
-S判断文件是否存在并且是一个套接字文件
-c判断文件是否存在并且是一个字符设备文件
-p判断文件是否存在并且是一个命名管道文件
-s判断文件是否存在并且是一个非空文件(有内容)

# 先判断zhu目录是否存在 存在则echo 不存在则创建
[root@maomao shell]# [ -d zhu ] && echo '存在' || mkdir zhu

# 前面加! 是非的意思
! -d 如果不存在 则创建
#!/bin/bash
back_dir=/usr/local/mysql_bcak	
if [ ! -d $back_dir ];then
       mkdir -p $back_dir
fi
       echo "开始备份..."

# -s 可以判断文件是否非空
[root@maomao shell]# [ -s free.sh ] && echo '非空' || echo "空"
非空
[root@maomao shell]# touch 123.txt
[root@maomao shell]# [ -s 123.txt ] && echo '非空' || echo "空"test -e file                    只要文件存在条件为真
[ -d /shell/dir1 ]             判断目录是否存在,存在条件为真
[ ! -d /shell/dir1 ]        判断目录是否存在,不存在条件为真
[[ -f /shell/1.sh ]]        判断文件是否存在,并且是一个普通的文件

判断文件权限

判断参数含义
-r当前用户对其是否可读
-w当前用户对其是否可写
-x当前用户对其是否可执行
-u是否有suid,高级权限冒险位
-g是否sgid,高级权限强制位
-k是否有t位,高级权限粘滞位

判断文件新旧

这里的新旧指的是文件的修改时间

判断参数含义
file1 -nt file2比较file1是否比file2新
file1 -ot file2比较file1是否比file2旧
file1 -ef file2比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode

# 创建一个硬链接
[root@maomao shell]# ln free.sh free2.sh 
[root@maomao shell]# [ free.sh -ef free2.sh ]
[root@maomao shell]# echo $?
0

判断整数

判断参数含义
-eq相等
-ne不等
-gt大于
-lt小于
-ge大于等于
-le小于等于
#!/bin/bash
# 磁盘空间警报脚本
disk_use=`df -Th |grep '/$' |awk '{print $(NF-1)}' |awk -F"%" '{print $1}'` 
mail_user=root
if [ $disk_use -gt 90 ];then
		echo "`date +%F-%H` disk:${disk_use}%" |mail -s "disk warning..." $mail_user	
fi

# 内存警报脚本
#!/bin/bash
mem_used=`free -m |grep Mem |awk '{print $3}'`
mem_total=`free -m |grep Mem |awk '{print $2}'`
mem_percent=$((mem_used*100/$mem_total))
warning_file=/shell/mem_war.txt
	rm -rf $warning_file
	#if [ $mem_percent -ge 80 ];then
	if (($mem_percent>60));then
			echo "`date +%F-%H` memory:${mem_percent}%" > $warning_file
	fi

	if [ -f $warning_file ];then
			mail -s "mem warning..." root < $warning_file
			rm -rf $warning_file
	fi

判断字符串

判断参数含义
-z判断是否为空字符串,字符串长度为0则成立
-n判断是否为非空字符串,字符串长度不为0则成立
string1 = string2判断字符串是否相等
string1 != string2判断字符串是否不等

[root@maomao shell]# [ $USER = 'root' ];echo $?
0
[root@maomao shell]# [ $USER = 'roo' ];echo $?
1
[root@maomao shell]# [ $USER = 'root' ];echo $?
0
[root@maomao shell]# [ $USER == 'root' ];echo $?
0
[root@maomao shell]# [[ $USER == 'root' ]];echo $?
0
[root@maomao shell]# [[ "$USER" == 'root' ]];echo $?
0

多重条件判断

判断符号含义举例
-a 和 &&逻辑与[ 1 -eq 1 -a 1 -ne 0 ] 或[ 1 -eq 1 ] && [ 1 -ne 0 ]
-o 和 ||逻辑或[ 1 -eq 1 -o 1 -ne 1 ] 或[ 1 -eq 1 ] || [1 -ne 1]

特别说明:
&& 前面的表达式为真,才会执行后面的代码
|| 前面的表达式为假,才会执行后面的代码
; 只用于分割命令或表达式

逻辑运算符总结

符号;和&&和||都可以用来分割命令或者表达式
分号(;)完全不考虑前面的语句是否正确执行,都会执行;号后面的内容
&&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
||符号,需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后内容;反之亦然
如果&&和||一起出现,从左往右依次看,按照以上原则

数值比较

[root@maomao ~]# [ $(id -u) -eq 0 ] && echo "the user is root" || echo "the user is not root"

C语言风格数值比较

注意:在(( ))中,=表示赋值;==表示判断
[root@maomao ~]# ((1==2));echo $?
[root@maomao ~]# ((1<2));echo $?
[root@maomao ~]# ((2>=1));echo $?
[root@maomao ~]# ((2!=1));echo $?
[root@maomao ~]# ((`id -u`==0));echo $?
[root@maomao ~]# ((a=123));echo $a
[root@maomao ~]# unset a
[root@maomao ~]# ((a==123));echo $?

字符串比较

注意:双引号引起来,看作一个整体;===[ 字符串 ] 比较中都表示判断
[root@maomao ~]# a='hello world';b=world
[root@maomao ~]# [ $a = $b ];echo $?
[root@maomao ~]# [ "$a" = "$b" ];echo $?
[root@maomao ~]# [ "$a" != "$b" ];echo $?
[root@maomao ~]# [ "$a" !== "$b" ];echo $?        错误
[root@maomao ~]# [ "$a" == "$b" ];echo $?
[root@maomao ~]# test "$a" != "$b";echo $?


test  表达式
[ 表达式 ]
[[ 表达式 ]]

思考:[ ][[ ]] 有什么区别?

[root@maomao ~]# a=
[root@maomao ~]# test -z $a;echo $?
[root@maomao ~]# a=hello
[root@maomao ~]# test -z $a;echo $?
[root@maomao ~]# test -n $a;echo $?
[root@maomao ~]# test -n "$a";echo $?

# [ '' = $a ];echo $?
-bash: [: : unary operator expected
2
# [[ '' = $a ]];echo $?
0


[root@maomao ~]# [ 1 -eq 0 -a 1 -ne 0 ];echo $?
[root@maomao ~]# [ 1 -eq 0 && 1 -ne 0 ];echo $?
[root@maomao ~]# [[ 1 -eq 0 && 1 -ne 0 ]];echo $?

批量创建用户脚本

#!/bin/bash
# 创建用户的脚本
# by stan Z
while true
do
        read -p "Please input number:" num
        if [[ ! "$num" =~ ^[0-9]+$ || "$num" =~ ^0+$ ]];then
                echo "error number!"
        else
                break
        fi  
done
while true
do
        read -p "Please input prefix:" prefix
        if [ -z "$prefix" ];then
                echo "error prefix"
        else
                break
        fi  
done
for i in `seq $num`
do
        user=$prefix$i
        useradd $user
        echo "123" |passwd --stdin $user &>/dev/null
        if [ $? -eq 0 ];then
                echo "$user is created."
        fi
done

<think>好的,用户现在问的是关于shell脚本中的 `-z` 参数。之前他们遇到了容器相关的错误,现在转向了shell脚本的问题,可能是在自动化或运维中遇到需要检查变量或字符串的情况。首先,我需要确认用户对shell脚本的基础了解程度,但根据之前的提问,他们可能有一定的技术背景。 `-z` 是用于判断字符串是否为空的条件测试。用户可能在使用if语句时遇到了问题,或者想知道如何正确使用这个参数。需要详细解释它的用法,包括语法、常见场景和示例。同时,用户可能有实际的问题需要解决,比如脚本中变量未设置导致错误,使用`-z`来预防。 要确保回答结构清晰,分点说明,结合例子,这样用户更容易理解。可能还需要对比其他类似参数,比如`-n`,帮助用户全面了解。另外,注意用户之前的问题涉及安全机制,可能他们编写脚本时需要考虑健壮性,所以强调`-z`在预防错误中的作用很重要。 需要检查是否有其他相关参数或常见错误需要提及,比如变量未加引号导致的问题,或者在测试时的语法细节(如空格)。还要提醒用户注意shell的不同版本可能会有差异,但`-z`在大多数情况下是通用的。 最后,总结使用场景和注意事项,确保用户能正确应用`-z`,避免常见陷阱。如果有必要的话,可以给出实际脚本的例子,展示如何在具体情境中使用这个测试条件。</think>--- ### **Shell 脚本中的 `-z` 参数详解** 在 Shell 脚本中,`-z` 是 **条件测试表达式** 中的一个操作符,用于判断字符串是否为空。它是编写脚本时处理变量、输入校验和逻辑控制的关键工具。 --- ### **1. 语法与功能** - **语法**:`if [ -z "$VAR" ]` 其中 `$VAR` 是要检查的变量或字符串。 - **功能**: 如果 `$VAR` **未定义**或值为**空字符串**,则条件为真(返回退出状态码 `0`);否则为假(返回非零状态码)。 --- ### **2. 典型使用场景** #### **场景 1:检查变量是否为空** ```bash #!/bin/bash name="" # 赋值为空 if [ -z "$name" ]; then echo "变量 name 为空或未定义" else echo "变量 name 的值为: $name" fi ``` **输出**:`变量 name 为空或未定义` --- #### **场景 2:校验脚本输入参数** ```bash #!/bin/bash if [ -z "$1" ]; then echo "错误:未提供命令行参数" exit 1 fi echo "第一个参数是: $1" ``` **运行**: - `./script.sh` → 输出错误并退出 - `./script.sh hello` → 输出 `第一个参数是: hello` --- #### **场景 3:依赖环境变量检查** ```bash #!/bin/bash if [ -z "$JAVA_HOME" ]; then echo "JAVA_HOME 未配置,请先设置环境变量" exit 1 fi echo "Java 路径: $JAVA_HOME" ``` --- ### **3. 常见注意事项** - **变量引号包裹**: 必须将变量用双引号包裹(如 `"$VAR"`),否则未定义的变量会导致语法错误。例如: ```bash [ -z $VAR ] # 若 VAR 未定义,等价于 [ -z ],语法错误 [ -z "$VAR" ] # 正确写法 ``` - **与 `-n` 的对比**: `-n` 是 `-z` 的反向操作符,用于判断字符串**非空**: ```bash if [ -n "$VAR" ]; then echo "VAR 非空" fi ``` - **避免过度检查**: 若变量可能包含空格或特殊字符(如 `VAR=" "`,一个空格),`-z` 会将其判定为**非空**。此时需根据业务逻辑进一步处理。 --- ### **4. 底层原理** - `-z` 是 Shell 内置的条件测试操作符,属于 `test` 命令(或 `[ ]` 语法)的一部分。 -Shell 解析时,`[ -z "$VAR" ]` 会被展开为对 `$VAR` 长度的判断。若长度为 0,则条件成立。 --- ### **5. 扩展用法** #### **组合其他条件** ```bash # 检查变量是否为空,且文件是否存在 if [ -z "$FILE" ] || [ ! -f "$FILE" ]; then echo "文件未指定或不存在" fi ``` #### **替代写法** ```bash # 使用双中括号(更灵活,支持正则匹配) if [[ -z $VAR ]]; then echo "VAR 为空" fi ``` --- ### **总结** `-z` 是 Shell 脚本中用于**空值校验**的核心操作符,常用于: 1. 验证输入参数 2. 检查环境变量 3. 避免未定义变量导致的错误 合理使用可提升脚本的健壮性,但需注意变量引号和边界条件处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值