返回首页

Shell 脚本速查

脚本模板

#!/usr/bin/env bash
set -euo pipefail
IFS=
    

SIGNAL LOST · 页面未找到

44

这条页面漂去了宇宙深处

你访问的 不存在或已被移动。

随时按 Ctrl + K 搜索全站

#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]],基础不牢可以先回那里翻翻。