Shell参数处理体系
├── 位置参数
│ ├── $0 --> 脚本名称(含路径)
│ ├── $1~$9 --> 第1到第9个参数(直接使用)
│ └── ${10}~${n} --> 第10个及以上参数(必须加{})
│
├── 特殊变量
│ ├── $# --> 参数总数
│ ├── $? --> 上条命令退出状态码
│ ├── $$ --> 当前Shell进程ID
│ └── $! --> 最后一个后台进程PID
│
└── 参数集合
├── $* --> 所有参数拼接为字符串
│ ├── 未加引号:拆分为单词
│ └── 加双引号:"$*" 合并为单个字符串
└── $@ --> 所有参数保留独立性
├── 未加引号:同$*
└── 加双引号:"$@" 保持参数原样
详解Shell脚本参数处理基础:从0/0/1到10用法,解析参数校验、遍历技巧,演示10用法,解析参数校验、遍历技巧,演示?/$#/$$实战应用,提供文件备份等综合案例。
脚本参数是用户在执行脚本时附加的输入信息,类似于Windows软件安装时的"下一步"选项配置。通过参数传递,可以让脚本动态适应不同场景需求。
典型应用场景:
批量重命名文件时指定文件名模式
部署服务时指定端口号和配置文件路径
数据备份时指定目标目录和保留天数
变量符号 | 功能说明 | 示例代码 | 注意事项 |
---|---|---|---|
$0 |
当前脚本文件名 | echo "脚本名: $0" |
包含执行时的路径 |
$1 |
第一个参数 | echo "参数1: $1" |
直接使用无需括号 |
$2 |
第二个参数 | echo "参数2: $2" |
最多支持到$9 |
${10} |
第十个参数 | echo "参数10: ${10}" |
必须用花括号包裹 |
$# |
参数总个数 | echo "参数个数: $#" |
校验参数必备 |
创建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
#!/bin/bash
# 校验参数是否存在
if [ -z "$1" ]; then
echo "错误:必须指定用户名"
exit 1
fi
# 设置默认值
backup_dir=${2:-"/var/backup"} # 如果未传入第二个参数,使用默认值
echo "备份目录: $backup_dir"
echo "===== 所有参数列表 ====="
for arg in "$@"; do
echo "参数内容: $arg"
done
total=$#
for ((i=1; i<=total; i++)); do
echo "第${i}个参数: ${!i}" # 使用间接引用
done
变量符号 | 输出形式 | 示例代码 | 使用场景 |
---|---|---|---|
$* |
所有参数拼接为单个字符串 | 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
注意:当参数包含空格时,
"$@"
会保留原始参数分界,而"$*"
会合并为一个字符串
# 检查文件是否存在
ls /etc/passwd
if [ $? -eq 0 ]; then
echo "文件存在"
else
echo "文件不存在"
fi
# 显示当前Shell的进程ID
echo "当前Shell PID: $$"
# 后台运行任务并记录PID
sleep 300 &
echo "后台任务PID: $!"
错误示例:
$ ./script.sh "Hello World" # 传入带空格的参数
echo $1 # 输出: Hello (丢失World)
正确写法:
echo "$1" # 输出: Hello World
# 设置参数默认值
username=${1:-"guest"} # 如果$1未设置,默认使用guest
log_level=${2:-"info"} # 默认日志级别为info
# 检查是否为数字
if ! [[ $2 =~ ^[0-9]+$ ]]; then
echo "错误:第二个参数必须是数字"
exit 1
fi
#!/bin/bash
# 参数1: 源目录 参数2: 备份目录(可选)
if [ $# -lt 1 ]; then
echo "用法: $0 <源目录> [备份目录]"
exit 1
fi
source_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"