深色模式
Shell 脚本基础:写出第一个脚本
摘要:Shell 脚本是运维自动化最省钱的第一步。本文依次演示变量、条件、循环、函数和参数处理,最后拼出一个实用的磁盘检查脚本。
适用环境
- Linux(AlmaLinux 9 / Ubuntu 22.04 均可)
- Bash 4.x 及以上:
bash --version可确认 - 一个普通用户 + sudo 权限
操作步骤
1. 创建并运行第一个脚本
bash
mkdir -p ~/scripts && cd ~/scripts
cat > hello.sh <<'EOF'
#!/usr/bin/env bash
echo "hello ops"
EOF
chmod +x hello.sh && ./hello.sh1
2
3
4
5
6
2
3
4
5
6
第一行 #!/usr/bin/env bash 是 shebang;chmod +x 后才能用 ./ 执行。
2. 变量、条件与循环
bash
cat > check.sh <<'EOF'
#!/usr/bin/env bash
name="ops" # 等号两边不能有空格
echo "hello ${name} $(date +%F)"
used=$(df -P / | awk 'NR==2 {print $5}' | tr -d '%')
if (( used > 80 )); then
echo "WARN: root fs used ${used}%"
else
echo "OK: root fs used ${used}%"
fi
for host in web01 web02; do echo "checking ${host}"; done
EOF
chmod +x check.sh && ./check.sh1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
双引号内变量会展开,单引号原样输出;$() 是命令替换。
3. 函数与参数
bash
cat > deploy.sh <<'EOF'
#!/usr/bin/env bash
set -u
log() { echo "[$(date +%T)] $*"; }
svc="${1:?用法: $0 <服务名> <版本>}"
ver="${2:-latest}" # 第二个参数默认值
log "deploy ${svc} version=${ver}"
EOF
chmod +x deploy.sh && ./deploy.sh nginx 1.251
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$1 $2 是位置参数,${1:?提示} 在缺失时给出提示并退出。
危险
rm -rf ${VAR}/* 一旦 VAR 为空或拼错就变成 rm -rf /*。删除前先 echo 出实际路径确认,变量一律加双引号。
验证
bash
bash -n hello.sh # 语法检查,无输出即正确
shellcheck hello.sh # 静态检查(需先安装 shellcheck)1
2
2
- [ ]
./hello.sh输出 hello ops - [ ]
./deploy.sh不带参数时给出用法提示而非堆栈
常见坑
等号两边加空格
name = "ops" 会被当成执行 name 命令。赋值必须写 name="ops"。
脚本在 Windows 编辑过
报 bad interpreter: /bin/bash^M 时,执行 sed -i 's/\r$//' script.sh。
[ ] 里忘了空格
[ -f /etc/hosts ] 括号两端必须有空格,写紧凑了会报错。