适用场景:Linux 运维脚本编写、日志处理、服务巡检;配套错题+语法规范 核心提醒:sh(dash)语法更严格,生产脚本推荐首行写 #!/bin/bash

一、if 条件判断

1. 基础语法

# 单分支
if 条件; then
    执行语句
fi

# 双分支
if 条件; then
    成立执行
else
    不成立执行
fi

# 多分支
if 条件1; then
    ...
elif 条件2; then
    ...
else
    ...
fi

❗ 关键字是 then,不是 than(高频笔误)

2. 两种条件括号对比

语法 标准 支持特性 字符串相等 适用场景
[ 表达式 ] POSIX 标准,sh/bash 通用 基础判断 只能用 = 兼容所有环境、可移植脚本
[[ 表达式 ]] bash 扩展,仅 bash 可用 正则匹配、逻辑运算、安全空变量 支持 == 复杂脚本、字符串匹配

易错坑:[ / ]] 前后必须有空格,if[、if[[$var 都会报语法错误

3. 常用判断表达式

文件判断

[ -f file ]   # 存在且是普通文件
[ -d dir ]    # 存在且是目录
[ -e path ]   # 文件/目录存在
[ -x file ]   # 可执行

数字比较([ ] 中必须用参数,不能用 > ==)

参数 含义
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

字符串判断

[ "$s1" = "$s2" ]    # 相等
[ -z "$var" ]       # 字符串为空
[ -n "$var" ]       # 字符串不为空

逻辑运算

  • [[ ]] 中用 && || !
  • [ ] 中用 -a -o !

二、循环结构

1. for 循环(三种写法)

写法1:遍历列表(运维最常用,遍历端口、文件列表)

for port in 9000 9001 9002
do
    echo "检测端口 $port"
done

写法2:C 语言风格(仅 bash 支持)

for ((i=1; i<=10; i++))
do
    echo $i
done

写法3:遍历命令输出

for file in $(ls *.log)
do
    echo "$file"
done

❗ 坑:文件名带空格时会分割错乱,逐行读取文件优先用 while read

2. while 循环(条件循环,逐行读文件首选)

# 基础计数
i=1
while [ $i -le 5 ]
do
    echo $i
    i=$((i+1))
done

# 逐行读取文件(生产推荐)
while IFS= read -r line
do
    echo "$line"
done < access.log

3. until 循环(了解)

条件不成立时循环,条件成立停止,与 while 相反。


三、case 多分支匹配

适合:参数解析、状态判断,替代大量 elif,支持通配符

case "$1" in
    start)
        echo "启动服务"
    ;;
    stop)
        echo "停止服务"
    ;;
    status)
        echo "查看状态"
    ;;
    *)
        echo "用法:$0 {start|stop|status}"
        exit 1
    ;;
esac

每个分支结尾用 ;;,*) 作为兜底匹配


四、循环控制关键字

关键字 作用 影响范围 示例结果(1~10循环,遇8触发)
continue 跳过本次循环剩余代码,进入下一轮 仅当前一次循环 输出 2、4、6、10(跳过8)
break 直接终止整个循环 整个循环 输出 2、4、6(到8直接跳出,后续不执行)

五、算术运算语法(高频易错)

核心区分

语法 作用 示例
$( 命令 ) 命令替换,执行命令并捕获输出 code=$(curl -s ...)
$(( 表达式 )) 算术运算,数值计算 sum=$((a+b))
(( 表达式 )) 数值条件判断,直接做 if 条件 if (( i%2 == 0 )); then

规范

  • (( )) 内部变量不用加 $、不用加引号,直接写变量名
  • 禁止在 [ ] / [[ ]] 内直接写加减乘除,数值计算必须用 $(( ))

六、高频错题汇总

错误现象 原因 正确写法
[: unexpected operator(sh 执行时报错) dash 的 [ ] 不支持 == 字符串比较改用 =,或用 bash 执行脚本
if[ "$a" -gt 5 ] 语法错误 if 和 [ 之间缺少空格 if [ "$a" -gt 5 ]
$("$i" % 2) 报 command not found 混淆 $( ) 命令替换和 $(( )) 算术运算 $((i % 2))
if [ $a > 10 ] 结果异常 [ ] 中不能用 > 做数字比较 if [ $a -gt 10 ]
than 关键字报错 笔误,shell 分支关键字是 then 改为 then
for $(ls) 文件名带空格时拆分错误 按空格分割输出 逐行读取改用 while read

七、速记口诀

if 空格分前后,then 别写成 than 单等通用双等扩,数字比较用减号 列表遍历用 for,读行首选 while read 跳本圈 continue,跳出全圈 break 命令替换圆括号,算术运算双括号

🔗 相关笔记