在掌握了 Linux 基础命令与简单脚本之后,很多人会发现,真正的难点并不在于语法本身,而在于如何把零散的命令与逻辑组织成一个高效、健壮、可维护的脚本。这就是 “进阶” 阶段的价值所在。它不仅要求我们理解 if
、for
、while
这些基本结构,更需要思考变量作用域、异常处理、调试方法,以及如何写出能适应复杂环境的自动化工具。本文将从实用的角度出发,带你一步步走进 Shell 脚本编程的更高层次。
基本结构
if 语句
在 Shell 脚本中,if
是控制程序逻辑的核心语句。它可以根据条件的真假来决定代码的执行路径。基本结构如下:
if [ 条件判断式 ]; then
命令1
命令2
elif [ 另一条件 ]; then
命令3
else
命令4
fi
要点
条件判断式
- 使用方括号
[ ]
包裹,注意左右要有空格。 - 常见的条件包括:字符串比较、数字比较、文件测试。
常用比较方式
字符串比较
if [ "$a" = "$b" ]; then
echo "字符串相等"
fi
整数比较
if [ "$num" -gt 10 ]; then
echo "大于10"
fi
(-eq
等于,-ne
不等于,-lt
小于,-ge
大于等于)
文件测试(常用)
if [ -f "/etc/passwd" ]; then
echo "文件存在"
fi
(-f
普通文件,-d
目录,-r
可读,-w
可写,-x
可执行)
多条件组合
if [ "$num" -gt 0 ] && [ "$num" -lt 100 ]; then
echo "在0到100之间"
fi
-a
表示 与,-o
表示 或,也可以用 &&
、||
。
简写
[ -d /tmp ] && echo "目录存在" || echo "目录不存在"
while 循环
while
循环常用于在条件满足时,反复执行一段代码,直到条件不再成立为止。基本结构如下:
while [ 条件判断式 ]; do
命令1
命令2
done
要点
条件判断式
- 每次循环开始前都会先判断一次条件。
- 条件为真 → 执行循环体;条件为假 → 退出循环。
计数器循环
count=1
while [ $count -le 5 ]; do
echo "第 $count 次循环"
count=$((count+1))
done
输出 1 到 5。
读取文件内容
while read line; do
echo "读到: $line"
done < /etc/passwd
按行读取 /etc/passwd
文件。
无限循环
while true; do
echo "一直循环,按 Ctrl+C 退出"
sleep 1
done
常用于守护进程或监控脚本。
与 until 的对比
while
:条件为 真 时循环。
until
:条件为 假 时循环
until [ "$num" -gt 5 ]; do
echo "num=$num"
num=$((num+1))
done
for 循环
在 Shell 脚本中,for
是最常用的循环结构之一。它通常用于 遍历一组值 或 按序执行一段逻辑。
用法
遍历列表
for name in Tom Jerry Alice; do
echo "Hello, $name!"
done
依次输出 Hello, Tom!
、Hello, Jerry!
、Hello, Alice!
。
使用通配符遍历文件
for file in *.txt; do
echo "发现文件: $file"
done
遍历当前目录下所有 .txt
文件。
C 风格的 for 循环
for ((i=1; i<=5; i++)); do
echo "第 $i 次循环"
done
输出 1 到 5。
与命令结合
for
可以直接用命令输出结果作为循环对象:
for user in $(cut -d: -f1 /etc/passwd); do
echo "系统用户: $user"
done
遍历 /etc/passwd
中的所有用户名。