Linux_shell脚本if语句具体教程

[复制链接]
发表于 2026-10-4 21:21:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

shell 脚本里所有的分支控制都建立在 if 上。if 的底层逻辑其实只有一句话:判断一个条件的返回值是不是 0。bash 里大部分判断写法最终都要靠 test 命令或方括号来落地,搞清楚「谁返回 0」,if 的各种写法就都通了。本文从最基础的语法结构讲起,把逻辑与或非、文件判断、数值与字符串比较、以及命令退出状态判断逐项拆开说明,并给出可直接复用的脚本片段。

基本语法结构

if 条件; then
    # 条件为真(返回值为 0)时执行的代码
elif 另一个条件; then
    # 另一个条件为真时执行的代码
else
    # 所有条件都不成立时执行的代码
fi

三个点要注意:条件后面必须跟分号再接 then,写成两行的换行等价于此;elif 是从 elif 而不是 else if;收尾是 fi,不是 endif。很多人写脚本时把 fi 漏掉,bash 会在下一行报语法错误,却往往看不出根因。

逻辑与 && 的用法

&& 连接两个条件,只有左边命令成功(返回 0)时,右边才会被执行,整体结果为真。

if 条件一 && 条件二; then
    echo "条件一和条件二都成立"
else
    echo "条件一或条件二有失败"
fi

实际场景里最典型的是「文件存在且可执行」,也就是既要看得到也要跑得动。

#!/bin/bash
FILE="/home/user/file.sh"

# 方括号写法
if [ -e "$FILE" ] && [ -x "$FILE" ]; then
    echo "[ 形式:文件存在且可执行"
else
    echo "[ 形式:文件不存在或不可执行"
fi

# 双方括号写法
if [[ -e "$FILE" && -x "$FILE" ]]; then
    echo "[[ 形式:文件存在且可执行"
else
    echo "[[ 形式:文件不存在或不可执行"
fi

单方括号写法里,两个判断各开一个 [ ;双方括号写法里,两个条件都塞进一个 [[ ]] 里。两者在多数场景都能跑,但 [[ ]] 是 bash 原生语法,对正则、通配符的支持更好,脚本里更推荐。另外变量一定要加双引号,路径里有个空格就会直接语法报错。

逻辑或 || 的用法

|| 与 && 正好相反:左边失败(返回非 0)时,右边才执行;两个里有一个成功,整个条件就成立。

if 条件一 || 条件二; then
    echo "条件一或条件二成立"
else
    echo "两个条件都失败"
fi

最实用的写法是「目录存在就用它,不存在就创建」,一步把判断和动作合起来。

#!/bin/bash
DIR="/home/user/mydir"

if [[ -d "$DIR" ]] || mkdir "$DIR" > /dev/null 2>&1; then
    echo "目录已存在或已成功创建"
else
    echo "创建目录失败"
fi
#!/bin/bash
# 另一种等价写法:先创建,再判断
mkdir -p "$DIR" && echo "目录就绪" || echo "目录创建失败"

&& 与 || 连在一起用的时候一定要想清楚失败分支,否则容易把错误信息吃掉却给了一个误导性的成功提示。写脚本时建议保留一次错误输出,别总把 2>&1 全部丢进黑洞。

逻辑非 ! 的用法

! 对一个条件取反:条件为真时 ! 之后为假,条件为假时取反后为真。

if ! 条件一; then
    echo "条件一为假,取反后为真"
else
    echo "条件一为真,取反后为假"
fi

典型场景是「文件不存在时才做某件事」,写成 if [ ! -f file.txt ] 一眼可读。

#!/bin/bash
if [ ! -f "file.txt" ]; then
    echo "文件不存在"
else
    echo "文件存在"
fi

还有一个容易让人绕晕的写法:! 和 && 一起用时,如果第二个位置放的是 echo,echo 永远成功,整条条件就会恒真。写这类组合时要先确认第二段的返回值是不是你想要的,否则调试半天会发现分支怎么跑都进同一边。

文件与目录判断

判定文件是否存在用 -f,判定目录是否存在用 -d,这是两套最常见的判断。

#!/bin/bash
# 先取当前脚本所在目录,避免相对路径出错
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

file="${SCRIPT_DIR}/example.txt"
echo ${file}

if [ -f "$file" ]; then
    echo "$file 文件存在"
else
    echo "$file 文件不存在"
fi
#!/bin/bash
dir="/home/user/myfolder"

if [ -d "$dir" ]; then
    echo "$dir 目录存在"
else
    echo "$dir 目录不存在"
fi

取脚本自身目录那段是值得背下来的模板:dirname 拿到脚本路径,cd 过去再 pwd,得到的绝对路径无论从哪里调用脚本都不会漂。

其它常用参数:

  • -e:检查文件或目录是否存在,不管它是文件还是目录。
  • -r:检查文件是否可读,非 root 权限下结果才精确(root 几乎总能读,判断会失真)。
  • -w:检查文件是否可写,同上,root 下参考价值有限。
  • -x:检查文件是否可执行,同上。

记住一条:做权限判断时用普通用户跑脚本,或者显式切到目标用户,否则 root 环境里的判定全是无意义的真。

数值比较

整数比较不能用 > < 这类符号(在方括号里 < 会被当成重定向),要用专用参数。

  • -lt:less than,小于
  • -eq:equal to,等于
  • -ne:not equal to,不等于
  • -gt:greater than,大于
  • -ge:greater than or equal to,大于或等于
  • -le:less than or equal to,小于或等于
#!/bin/bash
a=2
b=2

if [[ $a -eq $b ]]; then
    echo "$a 等于 $b"
else
    echo "$a 不等于 $b"
fi

注意参数两侧要留空格:[ $a -eq $b ] 中间不能挤在一起,否则会被解析成一个字符串。

字符串比较

  • ==:字符串相等
  • !=:字符串不相等
#!/bin/bash
a="abcdef"
b="abcde"

if [[ $a == $b ]]; then
    echo "字符串 $a 和 $b 相等"
else
    echo "字符串 $a 和 $b 不相等"
fi

if [[ $a != $b ]]; then
    echo "字符串 $a 和 $b 不相等"
else
    echo "字符串 $a 和 $b 相等"
fi

判断上一步命令的返回串、检查配置文件里的某个字段是否等于期望值,都用这两个。z 判断空串也很常用:[ -z "$x" ] 表示变量为空。

算术比较

要比较大小而不是相等关系时,方括号里没有 > < 的位置(会被当重定向),改用 (( )) 或 [[ ]] 里写算术表达式。

#!/bin/bash
a=6
b=8

if (( a + b > 10 )); then
    echo "a 和 b 的和大于 10"
fi

双圆括号里可以直接写 + - * / 和 > <,写起来跟 C 语言一样顺,处理阈值判断时比一串 -gt -lt 清爽。

判断命令的退出状态

shell 里每条命令执行完都会带回一个退出状态,存在 $? 里。0 表示成功,非 0 表示失败。if 后面直接跟命令名,就是在判断它的退出状态。

#!/bin/bash
# 执行某个命令
ls /home > /dev/null 2>&1

# 判断命令是否成功
if [ $? -eq 0 ]; then
    echo "命令执行成功"
else
    echo "命令执行失败"
fi

$? 记录的是上一条命令的退出状态,这条命令一过就被覆盖,所以想保留它、就得紧跟着就取用,中间不要再插别的命令。更简洁的写法是把命令直接放在 if 后面。

#!/bin/bash
if ls /home > /dev/null 2>&1; then
    echo "目录可读"
else
    echo "目录不存在或不可读"
fi

小结

把 if 的核心抓住就三句话:条件里放的是命令的返回值而不是布尔值;&& 要两边都成、|| 只要一边成、! 直接翻转;文件用 -f/-d/-e,数值用 -lt/-eq/-gt 这一族,字符串用 ==/!=,算术和退出状态判断直接把命令写进 if。写法上统一用 [[ ]] 并给变量加引号,能避开绝大多数的空格与转义坑。剩下的就是按业务场景把这些片段拼起来。

qidao123.com企服评测-应用市场 编辑提示:本文为 Bash 脚本条件判断的实操整理,示例脚本均可在 bash 环境直接运行,涉及文件与目录操作的片段请在测试目录验证后再用于生产脚本。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表