Shell脚本6 -- 条件判断if

声明:
本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,请联系本人,我将立即删除相关内容。
本文旨在帮助网络安全爱好者提升自身安全技能,并严格遵守国家法律法规。任何人利用本文中的信息从事违法活动,均与本文作者和“泷羽sec”无关。请读者自觉遵纪守法,合理合法使用相关知识。


在 Shell 脚本中,if 语句是实现条件判断和分支逻辑的核心语法。通过使用 if,我们可以根据条件执行不同的操作,使脚本更加灵活和强大。本文将介绍 if 语句的基本语法、常见使用场景及注意事项。


1 基本语法

Shell 中的 if 语句的基本结构如下:

if 条件; then
    命令1
    命令2
fi

常见的扩展形式包括:

  1. if-else 语句:
if 条件; then
	命令1
else
	命令2
fi
  1. if-elif-else 语句:
if 条件1; then
	命令1
elif 条件2; then
	命令2
else
	命令3
fi

2 条件判断方式

if 中,条件判断主要依赖 test[] 命令。以下是常见的条件表达式:

2.1 文件条件

  • -e file:文件存在。
  • -d file:文件是目录。
  • -f file:文件是普通文件。
  • -s file:文件大小非零。

示例:

if [ -e "/etc/passwd" ]; then
	echo "文件存在"
fi

Pasted image 20241118203753

2.2 字符串条件

  • [ "$a" = "$b" ]:判断字符串是否相等。
  • [ -z "$a" ]:判断字符串是否为空。

示例:

if [ "$USER" = "root" ]; then
	echo "当前用户是 root"
fi

Pasted image 20241118203919

2.3 数值条件

  • -eq:等于。
  • -ne:不等于。
  • -gt:大于。
  • -lt:小于。

示例:

if [ "$1" -gt 10 ]; then
	echo "参数大于 10"
fi

Pasted image 20241118203954

2.4 逻辑运算符

  • [ 条件1 -a 条件2 ] 或者 [ 条件1 ] && [ 条件2 ]:逻辑与。

  • [ 条件1 -o 条件2 ] 或者 [ 条件1 ] || [ 条件2 ]:逻辑或。

  • ! 条件:逻辑非。

    示例:

if [ -z "$1" ] || [ -z "$2" ]; then
    echo "请提供两个参数"
    exit 1
fi

if [ "$1" -lt 10 -a "$2" -lt 10 ]; then
    echo "参数1和参数2都小于10"
fi

Pasted image 20241118204528


3 示例

3.2 示例 1:检查文件类型

#!/bin/bash
file="/etc/passwd"

if [ -f "$file" ]; then
    echo "$file 是一个普通文件"
elif [ -d "$file" ]; then
    echo "$file 是一个目录"
else
    echo "$file 不存在或类型未知"
fi

Pasted image 20241118204631

3.2 示例 2:判断用户输入

#!/bin/bash
read -p "请输入一个数字:" number

if [ "$number" -gt 0 ]; then
    echo "这是一个正数"
elif [ "$number" -lt 0 ]; then
    echo "这是一个负数"
else
    echo "这是零"
fi

Pasted image 20241118204715

3.2 示例 3:综合逻辑判断

#!/bin/bash
if [ $# -eq 2 ]; then
    echo "参数数量正确"
    if [ "$1" = "$2" ]; then
        echo "两个参数相等"
    else
        echo "两个参数不相等"
    fi
else
    echo "请输入两个参数"
fi

Pasted image 20241118204802


4 注意事项

  1. 条件语句的书写:

    • 条件表达式中的变量应加引号,防止因空值导致语法错误。
    • [ 条件 ] 和条件内容之间需要有空格,否则会报错。
  2. 使用 test 命令:

    • test 命令和 [] 等价,可以直接使用,如:
      if test -e "/etc/passwd"; then
          echo "文件存在"
      fi
      
  3. Shell 的兼容性问题:

    • bashsh 中,if 的语法一致,但某些高级功能可能在不同版本中表现不同。
<think>我们在讲解Linux shell脚本中`if [ -z "$var" ]`的作用。 这个条件判断用于检查字符串变量`$var`是否为空(即长度为零)。 如果变量`$var`没有被设置或者被设置为空字符串,那么条件为真(true)。 解释: - `-z`:表示检查字符串长度是否为零(zero length)。 - 注意:在shell脚本中,变量引用最好用双引号括起来,以避免变量未定义时出现语法错误。 - 例如,如果变量`var`没有被设置,那么`$var`会被解释为空字符串,因此`-z`检查就会返回真。 示例脚本: 我们写一个简单的脚本来演示`-z`的用法。 代码: ```bash #!/bin/bash # 示例1:检查一个未赋值的变量 unset var1 if [ -z "$var1" ]; then echo "var1 is empty or not set." else echo "var1 is not empty." fi # 示例2:给变量赋空值 var2="" if [ -z "$var2" ]; then echo "var2 is empty." fi # 示例3:给变量赋值 var3="hello" if [ -z "$var3" ]; then echo "var3 is empty." else echo "var3 is not empty." fi ``` 运行结果: - 示例1:输出"var1 is empty or not set.",因为var1未设置,等同于空字符串。 - 示例2:输出"var2 is empty.",因为var2被赋值为空字符串。 - 示例3:输出"var3 is not empty.",因为var3有非空值。 注意事项: 1. 在条件判断中,变量引用使用双引号,是为了防止变量为空时导致的条件判断语法错误。例如,如果写成`[ -z $var ]`,当`var`未设置时,表达式就变成了`[ -z ]`,这会被解释为测试`-z`这个字符串是否为空(非空),从而条件为假,这显然不符合预期。而使用双引号后,即使变量为空,也会变成`[ -z "" ]`,这才是正确的测试空字符串。 2. 另外,也可以使用`[[ -z $var ]]`(双中括号),在双中括号中,变量引用可以不加双引号,因为双中括号结构可以防止空变量导致的问题。但是为了可移植性,很多脚本仍然使用单中括号并加双引号。 因此,`if [ -z "$var" ]`用于判断变量`var`是否为空(包括未设置的情况)。 </think>在 Linux shell 脚本中,`if [ -z "$var" ]` 用于判断 **字符串变量是否为空**(包括未定义的变量)。以下是详细解释: ### 代码示例 ```bash #!/bin/bash # 示例1:空字符串 empty_str="" if [ -z "$empty_str" ]; then echo "empty_str 是空字符串" fi # 示例2:未定义的变量 if [ -z "$undefined_var" ]; then echo "undefined_var 未定义或为空" fi # 示例3:非空字符串 non_empty="hello" if [ -z "$non_empty" ]; then echo "这行不会被执行" else echo "non_empty 不是空字符串" fi ``` ### 运行结果: ``` empty_str 是空字符串 undefined_var 未定义或为空 non_empty 不是空字符串 ``` ### 关键点解释: 1. **`-z` 的作用** - 检查紧跟其后的字符串 **长度是否为 0** - 若为空("")或未定义 → 返回真(条件成立) - 若有任意字符(包括空格)→ 返回假 2. **双引号的重要性** `"$var"` 必须加双引号: - 防止未定义变量被解析为空白参数(导致语法错误) - 正确处理包含空格的值(如 `[ -z $var ]` 在 `var=" "` 时会失效) 3. **常见用途** - 验证用户输入是否为空 - 检查配置文件参数是否存在 - 确保脚本依赖的变量已设置 ### 等效替代方法 ```bash # 检查变量是否非空(与 -z 相反) if [ -n "$var" ]; then echo "变量非空" fi # 显式检查未定义(现代 shell 推荐) if [ -v var_name ]; then echo "变量已定义(无论是否为空)" fi ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值