跳到主要内容

Shell 脚本

Shell 脚本是自动化运维与批处理任务的基础。Bash 是最常用的脚本语言,语法简单且与系统命令天然集成。

Shebang 与执行

脚本首行的 Shebang 指定解释器。

#!/usr/bin/env bash
echo "Hello, $(whoami)"

赋予执行权限后即可运行:chmod +x deploy.sh && ./deploy.sh,也可显式调用 bash deploy.sh

变量与特殊变量

变量赋值时等号两侧不能有空格,引用使用 $${}

name="linux"
echo "hello $name, version ${name}_2"

# 特殊变量
$0 # 脚本名
$1 # 第一个参数
$# # 参数个数
$@ # 全部参数
$? # 上条命令退出码

$@$* 看似相似,但 "$@" 会保留参数边界,推荐使用前者遍历参数。

条件与循环

# 条件
if [[ -f "$1" ]]; then
echo "file exists"
elif [[ -d "$1" ]]; then
echo "is directory"
else
echo "not found"
fi

# for 循环
for f in *.log; do
gzip "$f"
done

# while 循环
count=0
while [[ $count -lt 5 ]]; do
echo $count
((count++))
done

[[ ]] 是 Bash 关键字,无需转义;[ ]test 命令的别名,注意两侧空格。

函数

log() {
local msg="$1"
echo "[$(date '+%F %T')] $msg"
}

log "task started"

函数内推荐用 local 声明局部变量,避免污染全局命名空间。

严格模式与调试

set -euo pipefail
  • -e:遇错即停。
  • -u:未定义变量报错。
  • -o pipefail:管道中任一命令失败即整体失败。

调试时使用 bash -x script.sh 打印每条执行命令,或 set -x 在脚本局部开启、set +x 关闭。