当前位置: 首页 > ds >正文

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"
http://www.xdnf.cn/news/2022.html

相关文章:

  • Java对接企业微信实战笔记
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]:如何使用CFStringRef类型字符串?
  • 【vue】【element-plus】 el-date-picker使用cell-class-name进行标记,type=year不生效解决方法
  • BongoCat - 跨平台键盘猫动画工具
  • 线程同步与互斥
  • ElementUi的Dropdown下拉菜单的详细介绍及使用
  • 软件测试大模型Agent探索(dify:chatflow+企业微信机器人)
  • 【C++类和数据抽象】复制构造函数
  • SIEMENS PLC 程序 GRAPH 程序解读 车型入库
  • 【深度强化学习 DRL 快速实践】近端策略优化 (PPO)
  • mybatis-plus里的com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析
  • Python Cookbook-6.8 避免属性读写的冗余代码
  • (PYTHON)函数
  • 多物理场耦合低温等离子体装置求解器PASSKEy2
  • uniapp小程序开发入门01-快速搭建一个空白的项目并预览它
  • 多模态(3):实战 GPT-4o 视频理解
  • 线上图书借阅小程序源码介绍
  • 系统测试的技术要求
  • 基于Docker的Flask项目部署完整指南
  • 基于C#+Unity实现遇见李白小游戏
  • 《强势量价关系》速读笔记
  • 【信息系统项目管理师】高分论文:论人力资源管理与成本管理(医院信息系统)
  • 【Python数据分析】Pandas模块之pd.concat 函数
  • 【Agent】LangManus深度解析:AI自动化框架的对比与langgraph原理
  • openwrt查询网关的命令
  • Flink部署与应用——部署方式介绍
  • 更智能的银行体验:生成式 AI 与语义搜索的实际应用
  • windows服务器及网络:搭建FTP服务器
  • 【AIGC】基础篇:VS Code 配置 Python 命令行参数调试debug超详细教程
  • DeepSeek 赋能全流程数据治理:构建智能化数据价值链