适用场景: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 命令替换圆括号,算术运算双括号
🔗 相关笔记
- Shell 流程控制错题笔记
- Shell01 基础复习笔记
- Shell03 函数与数组学习笔记
评论