Shell脚本参数处理:位置变量/预定义变量
Shell参数处理体系
├── 位置参数
│ ├── $0 --> 脚本名称(含路径)
│ ├── $1~$9 --> 第1到第9个参数(直接使用)
│ └── ${10}~${n} --> 第10个及以上参数(必须加{})
│
├── 特殊变量
│ ├── $# --> 参数总数
│ ├── $? --> 上条命令退出状态码
│ ├── $$ --> 当前Shell进程ID
│ └── $! --> 最后一个后台进程PID
│
└── 参数集合├── $* --> 所有参数拼接为字符串│ ├── 未加引号:拆分为单词│ └── 加双引号:"$*" 合并为单个字符串└── $@ --> 所有参数保留独立性├── 未加引号:同$*└── 加双引号:"$@" 保持参数原样
摘要
详解Shell脚本参数处理基础:从0/0/1到10用法,解析参数校验、遍历技巧,演示10用法,解析参数校验、遍历技巧,演示?/$#/$$实战应用,提供文件备份等综合案例。
一、Shell参数基础认知
1. 什么是脚本参数?
脚本参数是用户在执行脚本时附加的输入信息,类似于Windows软件安装时的"下一步"选项配置。通过参数传递,可以让脚本动态适应不同场景需求。
典型应用场景:
-
批量重命名文件时指定文件名模式
-
部署服务时指定端口号和配置文件路径
-
数据备份时指定目标目录和保留天数
二、参数变量全解析
1. 基础参数变量
变量符号 | 功能说明 | 示例代码 | 注意事项 |
---|---|---|---|
$0 | 当前脚本文件名 | echo "脚本名: $0" | 包含执行时的路径 |
$1 | 第一个参数 | echo "参数1: $1" | 直接使用无需括号 |
$2 | 第二个参数 | echo "参数2: $2" | 最多支持到$9 |
${10} | 第十个参数 | echo "参数10: ${10}" | 必须用花括号包裹 |
$# | 参数总个数 | echo "参数个数: $#" | 校验参数必备 |
2. 基础示例演示
创建basic_args.sh
脚本:
#!/bin/bash
echo "========== 基础参数演示 =========="
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "第十个参数: ${10}"
echo "参数总数: $#"
执行命令与输出:
$ ./basic_args.sh A B C D E F G H I J K
========== 基础参数演示 ==========
脚本名称: ./basic_args.sh
第一个参数: A
第二个参数: B
第十个参数: J
参数总数: 11
三、参数处理进阶技巧
1. 参数校验与默认值
#!/bin/bash
# 校验参数是否存在
if [ -z "$1" ]; thenecho "错误:必须指定用户名"exit 1
fi# 设置默认值
backup_dir=${2:-"/var/backup"} # 如果未传入第二个参数,使用默认值
echo "备份目录: $backup_dir"
2. 遍历所有参数
方法一:直接遍历
echo "===== 所有参数列表 ====="
for arg in "$@"; doecho "参数内容: $arg"
done
方法二:通过索引遍历
total=$#
for ((i=1; i<=total; i++)); doecho "第${i}个参数: ${!i}" # 使用间接引用
done
四、特殊参数变量详解
1. 参数集合变量
变量符号 | 输出形式 | 示例代码 | 使用场景 |
---|---|---|---|
$* | 所有参数拼接为单个字符串 | echo $* | 快速查看参数 |
$@ | 保留参数的独立性的数组 | for arg in "$@"; do | 精确处理参数 |
核心区别演示:
#!/bin/bash
echo "===== 不加引号 ====="
echo "\$*输出: $*"
echo "\$@输出: $@"echo "===== 加双引号 ====="
echo "\"\$*\"输出: "$*""
echo "\"\$@\"输出: "$@""
执行结果:
$ ./diff_demo.sh "Hello World" "Linux Shell"
===== 不加引号 =====
$*输出: Hello World Linux Shell
$@输出: Hello World Linux Shell
===== 加双引号 =====
"$*"输出: Hello World Linux Shell
"$@"输出: Hello World Linux Shell
注意:当参数包含空格时,
"$@"
会保留原始参数分界,而"$*"
会合并为一个字符串
五、状态变量实战应用
1. 命令执行状态码
# 检查文件是否存在
ls /etc/passwd
if [ $? -eq 0 ]; thenecho "文件存在"
elseecho "文件不存在"
fi
2. 进程ID获取
# 显示当前Shell的进程ID
echo "当前Shell PID: $$"# 后台运行任务并记录PID
sleep 300 &
echo "后台任务PID: $!"
六、常见问题解决方案
1. 参数包含空格的处理
错误示例:
$ ./script.sh "Hello World" # 传入带空格的参数
echo $1 # 输出: Hello (丢失World)
正确写法:
echo "$1" # 输出: Hello World
2. 参数个数不足的容错处理
# 设置参数默认值
username=${1:-"guest"} # 如果$1未设置,默认使用guest
log_level=${2:-"info"} # 默认日志级别为info
3. 参数类型校验
# 检查是否为数字
if ! [[ $2 =~ ^[0-9]+$ ]]; thenecho "错误:第二个参数必须是数字"exit 1
fi
七、综合实战案例
文件备份脚本
#!/bin/bash
# 参数1: 源目录 参数2: 备份目录(可选)
if [ $# -lt 1 ]; thenecho "用法: $0 <源目录> [备份目录]"exit 1
fisource_dir=$1
backup_dir=${2:-"/var/backup"}
timestamp=$(date +%Y%m%d)tar -czf "${backup_dir}/backup_${timestamp}.tar.gz" "$source_dir"
echo "备份完成!文件保存到: ${backup_dir}/backup_${timestamp}.tar.gz"