如何在 Shell 脚本中如何使用条件判断语句?(中等)

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:Shell 面试

文章目录

  • 一、🍀前言
    • [1.1 ☘️基本示例](#1.1 ☘️基本示例)
    • [1.2 ☘️使用语法](#1.2 ☘️使用语法)
    • [1.3 ☘️知识扩展](#1.3 ☘️知识扩展)

一、🍀前言

在 Shell 脚本中,条件判断语句非常重要,主要用于控制程序流程。最常用的条件判断语句有 if、elif、else 和 case。这些语句允许我们根据不同的条件执行不同的代码块。

1.1 ☘️基本示例

powershell 复制代码
#!/bin/bash

read -p "请输入一个数字: " num

if [ $num -gt 10 ]; then
  echo "数字大于10"
elif [ $num -eq 10 ]; then
  echo "数字等于10"
else
  echo "数字小于10"
fi

我们可以看到使用 条件 来进行判断,并用 then 来引导要执行的命令,最后用 fi 结束 if 语句。

case 语句则用于多重分支条件判断:

powershell 复制代码
#!/bin/bash

read -p "请输入一个选择 (a/b/c): " choice

case $choice in
  a)
    echo "你选择了a"
    ;;
  b)
    echo "你选择了b"
    ;;
  c)
    echo "你选择了c"
    ;;
  *)
    echo "无效选择"
    ;;
esac

1.2 ☘️使用语法

一、基本语法

  1. if-then-fi 基础结构
powershell 复制代码
if [ 条件 ]
then
    # 条件为真时执行的代码
fi
  1. 带 else 的分支
powershell 复制代码
if [ 条件 ]; then
    # 条件为真时执行
else
    # 条件为假时执行
fi
  1. 多分支 (elif)
powershell 复制代码
if [ 条件1 ]; then
    # 条件1为真时执行
elif [ 条件2 ]; then
    # 条件2为真时执行
else
    # 所有条件均不满足时执行
fi

二、条件测试类型

  1. 字符串比较
操作符 说明
"str1" = "str2" 字符串相等
"str1" != "str2" 字符串不等
-z "$str" 字符串为空
-n "$str" 字符串非空

示例:

powershell 复制代码
if [ "$var" = "hello" ]; then
    echo "变量值为 hello"
fi
  1. 数值比较
操作符 说明
num1 -eq num2 等于 (equal)
num1 -ne num2 不等于 (not equal)
num1 -gt num2 大于 (greater than)
num1 -lt num2 小于 (less than)
num1 -ge num2 大于等于
num1 -le num2 小于等于

示例:

powershell 复制代码
if [ $num -gt 10 ]; then
    echo "数值大于 10"
fi
  1. 文件/目录测试
操作符 说明
-e file 文件/目录存在
-f file 是普通文件
-d dir 是目录
-r file 可读
-w file 可写
-x file 可执行
-s file 文件大小 >0 字节

示例:

powershell 复制代码
if [ -f "/path/to/file.txt" ]; then
    echo "文件存在且是普通文件"
fi

三、高级条件组合

  1. 逻辑运算符

AND 逻辑:&& 或 -a

powershell 复制代码
if [ $num -gt 10 -a $num -lt 20 ]; then
    echo "数值在 10~20 之间"
fi

或:

powershell 复制代码
if [[ $num -gt 10 && $num -lt 20 ]]; then
    echo "数值在 10~20 之间"
fi

OR 逻辑:|| 或 -o

powershell 复制代码
if [ "$str" = "yes" -o "$str" = "y" ]; then
    echo "输入了 yes 或 y"
fi
  1. case 语句(多条件分支)
powershell 复制代码
case "$variable" in
    pattern1)
        # 匹配 pattern1 时执行
        ;;
    pattern2|pattern3)
        # 匹配 pattern2 或 pattern3 时执行
        ;;
    *)
        # 默认分支
        ;;
esac

示例:

powershell 复制代码
case "$1" in
    start)
        echo "启动服务..."
        ;;
    stop)
        echo "停止服务..."
        ;;
    *)
        echo "用法: $0 {start|stop}"
        exit 1
        ;;
esac

四、注意事项

空格要求

\[ ] 内的条件必须与括号有空格分隔:

powershell 复制代码
if [ $a -eq $b ]; then   # 正确
if [$a -eq $b]; then     # 错误!

变量引号

变量建议用双引号包裹,避免空值或空格导致错误:

powershell 复制代码
if [ -n "$var" ]; then   # 正确
if [ -n $var ]; then     # 若 var 为空会报错

Bash 扩展特性

使用 \[ ](仅限 Bash)支持更复杂的逻辑和模式匹配:

powershell 复制代码
if [[ "$str" == h* ]]; then   # 匹配以 h 开头的字符串
    echo "匹配成功"
fi

错误处理

添加 set -euo pipefail 在脚本开头可增强健壮性(遇到错误立即退出)。

1.3 ☘️知识扩展

除了基本的使用方法,Shell 条件判断中有很多技巧和特殊用法,以下是一些常见的扩展点:

1)条件表达式:

-eq:等于

-ne:不等于

-gt:大于

-lt:小于

-ge:大于等于

-le:小于等于

2)字符串判断:

-z " s t r " :字符串长度为零 − n " str" :字符串长度为零 -n " str":字符串长度为零−n"str" :字符串长度不为零

" s t r 1 " = " str1" = " str1"="str2" :字符串相等

" s t r 1 " ! = " str1" != " str1"!="str2" :字符串不等

3)文件判断:

-e 文件 :文件存在

-r 文件 :文件存在且可读

-w 文件 :文件存在且可写

-x 文件 :文件存在且可执行

-d 文件 :目录存在

-f 文件 :文件存在且是普通文件

4)逻辑运算:

&&:逻辑与

||:逻辑或

!:逻辑非

例如,使用文件判断和逻辑运算:

powershell 复制代码
#!/bin/bash

if [ -e "somefile.txt" ]; then
  echo "文件存在"
else
  echo "文件不存在"
fi

if [ -r "somefile.txt" ] && [ -w "somefile.txt" ]; then
  echo "文件可读且可写"
fi
相关推荐
CoderYanger12 小时前
A.每日一题:3020. 子集中元素的最大数量
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
lvchaoq14 小时前
this指向面试代码输出题目合集
javascript·面试·职场和发展
wuqingshun31415915 小时前
MySQL 如何解决深度分页问题?
java·mysql·面试
weixin_7275356216 小时前
JVM 常见八股面试问答:深入底层原理
jvm·面试·职场和发展
CoderYanger16 小时前
A.每日一题:1967题+1331题
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
ShineWinsu16 小时前
对于Linux:TCPsocket编程基础的解析
linux·网络协议·tcp/ip·面试·笔试·进程·远程指令
胡萝卜术19 小时前
从暴力到滑动窗口的终极形态:力扣3「无重复字符的最长子串」的优化进化之路
前端·javascript·面试
触底反弹1 天前
🔥 Git 从零到精通:彻底搞懂核心概念与工作原理
git·面试·开源
至乐活着1 天前
Shell脚本编写最佳实践:打造健壮、可维护的自动化利器
自动化·bash·shell·脚本·最佳实践
不简说1 天前
JS 代码技巧 vol.4 — 10 个异步并发控制,Promise.all 这帮兄弟的踩坑实录
前端·javascript·面试