💜 想真正擅长编程? 从一门课程开始,100% 免费

第8节:脚本参数与选项解析

一、位置参数变量

Shell 脚本运行时,可以通过命令行向脚本传递参数。 这些参数会自动保存在特殊变量中:

变量 含义
$0 当前脚本的名称(含路径)
$1 第1个参数
$2 第2个参数
$# 参数个数
$@ 以独立字符串形式输出所有参数
$* 以单字符串形式输出所有参数

📘 示例:打印所有参数

Shell
#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数个数: $#"
echo "所有参数(\$@): $@"
echo "所有参数(\$*): $*"

运行:

Shell
bash demo.sh A B C

输出:

plain
脚本名称: demo.sh
第一个参数: A
第二个参数: B
参数个数: 3
所有参数($@): A B C
所有参数($*): A B C

💡 区别提示:

  • $@ —— 循环遍历时每个参数单独处理
  • $* —— 所有参数当作一个整体字符串

二、getopts 解析选项

当脚本需要支持类似 -s /data -d /backup -t tar 的选项形式时,可用内置命令 getopts。

语法:

Shell
while getopts "s:d:t:" opt; do
  case $opt in
    s) SRC=$OPTARG ;;
    d) DEST=$OPTARG ;;
    t) TYPE=$OPTARG ;;
    *) echo "未知参数"; exit 1 ;;
  esac
done

说明:

  • getopts "s:d:t:" opt :定义3个选项 -s -d -t,冒号表示后面需要跟值;
  • $OPTARG :保存当前选项对应的参数值;
  • $opt :保存当前选项名。

三、实战案例:带选项的备份脚本

需求:编写一个可指定源目录、目标目录、备份类型(tar/zip)的通用备份脚本。

Shell
#!/bin/bash
# backup.sh -s /data -d /backup -t tar

while getopts "s:d:t:" opt; do
  case $opt in
    s) SRC=$OPTARG ;;
    d) DEST=$OPTARG ;;
    t) TYPE=$OPTARG ;;
    *) echo "Usage: $0 -s <source> -d <dest> -t <tar|zip>"
       exit 1 ;;
  esac
done

# 参数检查
if [[ -z "$SRC" || -z "$DEST" || -z "$TYPE" ]]; then
  echo "参数不完整!"
  echo "Usage: $0 -s <source> -d <dest> -t <tar|zip>"
  exit 1
fi

# 创建目标目录
mkdir -p "$DEST"

# 生成时间戳
DATE=$(date +"%Y%m%d_%H%M%S")
FILENAME="backup_${DATE}"

# 根据类型执行备份
if [[ "$TYPE" == "tar" ]]; then
  tar -czf "$DEST/${FILENAME}.tar.gz" "$SRC"
elif [[ "$TYPE" == "zip" ]]; then
  zip -r "$DEST/${FILENAME}.zip" "$SRC"
else
  echo "不支持的类型: $TYPE"
  exit 1
fi

echo "✅ 备份完成:$DEST/${FILENAME}.$TYPE"

运行:

Shell
bash backup.sh -s /data -d /backup -t tar

四、参数与错误处理建议

  • 使用 getopts 时,推荐在 case 语句中包含 * 处理未知选项;
  • 关键参数缺失时,要打印使用帮助(usage);
  • 脚本开头可加入:
Shell
[[ $# -eq 0 ]] && echo "使用 -h 查看帮助" && exit 1

五、🧩 小练习:参数解析练习

编写一个脚本 args_info.sh,输出:

  1. 脚本名
  2. 参数总数
  3. 每个参数单独输出(使用循环)

运行示例:

Shell
bash args_info.sh apple banana cherry

输出:

plain
脚本名:args_info.sh
参数个数:3
参数1:apple
参数2:banana
参数3:cherry

六、🏁 课后作业:实现一个带 --help 提示的脚本

要求:

  • 编写脚本 mytool.sh;

  • 支持选项:

    • -f <filename>:指定文件;
    • -l:显示文件行数;
    • --help:显示帮助信息;
  • 示例运行:

Shell
bash mytool.sh -f test.txt -l
bash mytool.sh --help
  • 输出格式示例:
plain
使用说明:
  -f <file>   指定要处理的文件
  -l          显示文件行数
  --help      显示本帮助