Shell 脚本速查
脚本模板
#!/usr/bin/env bash
set -euo pipefail
IFS=
#39;\n\t'
main() {
echo "Hello, $*"
}
main "$@"
set -euo pipefail 的含义:
| 选项 | 效果 |
|---|---|
-e | 任一命令失败立即退出 |
-u | 使用未定义变量报错 |
-o pipefail | 管道中任一命令失败则整体失败 |
变量与参数
NAME=${1:?需要一个名字} # 未提供则报错
GREETING="${2:-Hello}" # 默认值
echo "$GREETING, $NAME"
echo "参数个数: $#"
echo "所有参数: $@"
echo "上一个命令退出码: $?"
条件与循环
if [[ -f "$file" ]]; then
echo "文件存在"
elif [[ -d "$dir" ]]; then
echo "目录存在"
else
echo "都不存在"
fi
for f in *.txt; do
echo "处理: $f"
done
while IFS= read -r line; do
echo "$line"
done < input.txt
函数
log() {
local level=$1; shift
echo "[$(date +%T)] [$level] $*"
}
log INFO "开始处理"
log WARN "注意:文件较大"
常用技巧
# 安全临时文件
tmp=$(mktemp)
trap 'rm -f "$tmp"' EXIT
# 字符串操作
filename="${path##*/}" # 去目录 -> 文件名
dirname="${path%/*}" # 去文件名 -> 目录
ext="${path##*.}" # 扩展名
base="${filename%.*}" # 去扩展名
# 批量重命名
for f in *.jpeg; do mv "$f" "${f%.jpeg}.jpg"; done
脚本里用到的命令大多出自 [[linux-commands]],基础不牢可以先回那里翻翻。