01. Shell 脚本基础
Shell 脚本就是把你在命令行里敲的命令攒成一个文件,一次写好,反复执行。就像流水线工人手里的小抄——照着做就行了。
脚本文件开头的 #!/bin/bash 叫 shebang,告诉系统用哪个解释器执行这个脚本。没有这行,系统不知道谁来干活:
bash
#!/bin/bash
# 这是我的第一个脚本
echo "Hello, World!"
# 变量——不用声明类型,直接赋值用
name="John"
echo "Hello, $name"
# 命令结果赋给变量——用 $() 括起来
today=$(date +%Y-%m-%d)
echo "Today is $today"
# 让脚本能执行
chmod +x script.sh
./script.sh02. 条件判断与循环
脚本要聪明就得会判断、会循环。if 就像十字路口——条件满足走一条路,不满足走另一条。for 就像流水线——挨个处理列表里的东西:
bash
#!/bin/bash
# if 判断
if [ "$1" == "start" ]; then
echo "Starting..."
elif [ "$1" == "stop" ]; then
echo "Stopping..."
else
echo "Usage: $0 start|stop"
fi
# 数值比较用 -gt, -lt, -eq
if [ $count -gt 10 ]; then
echo "大于 10"
fi
# 文件判断
if [ -f "/etc/nginx/nginx.conf" ]; then
echo "配置文件存在"
fi
# for 循环
for user in alice bob charlie; do
echo "Hello, $user"
done
# while 循环
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
count=$((count + 1))
done03. 函数与传参
复杂脚本得拆成函数,不然就是一个大长条面条代码。函数就像工具箱里的每个工具——各管各的活:
bash
#!/bin/bash
# 定义函数
backup_dir() {
local src=$1
local dest=$2
echo "Backing up $src to $dest..."
tar -czf "$dest" "$src"
}
check_disk() {
local threshold=$1
local usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $usage -gt $threshold ]; then
echo "WARNING: Disk usage is $usage%!"
fi
}
# 调用函数
backup_dir /var/www /backup/www-$(date +%Y%m%d).tar.gz
check_disk 80
# 脚本参数:$1 第一个参数, $2 第二个, $# 参数个数, $@ 所有参数
echo "脚本被传了 $# 个参数"
echo "第一个参数是 $1"04. 错误处理——别让脚本静默崩溃
脚本里一个命令失败了,后面的还傻乎乎接着跑——这很危险。加上 set -e 让脚本遇到错误就停。set -u 防止用未定义变量。加上错误处理让你的脚本靠谱十倍:
bash
#!/bin/bash
set -euo pipefail # 三件套:遇错就停 + 未定义变量报错 + 管道中任意命令失败都算失败
# 用 trap 做清理工作(即使出错也会执行)
cleanup() {
echo "Cleaning up..."
rm -f /tmp/lockfile
}
trap cleanup EXIT
# 或者处理特定错误
trap 'echo "Error on line $LINENO"' ERR
# 关键操作前检查
if [ ! -f "./config.conf" ]; then
echo "FATAL: config.conf not found!"
exit 1
fi
echo "Script completed successfully"set -euo pipefail 是脚本的「安全气囊」——强烈建议每个脚本开头都加上,能救你无数次。
知识测验
第 1/4 题正确 0
Shell 脚本的 shebang 是什么?
下一节
下一节 防火墙管理