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

linux shell 脚本 之 getopt

1、getopt是什么

   getopt是一个用于解析命令行选项的工具,常用于编写需要处理多个命令行参数的脚本。它支持短选项(如 -v)和长选项(如 --version),并能处理带有参数的选项。getopt是 GNU 库中的一个标准工具,大多数 Unix 和 Linux 系统上都提供了它的实现。

2、getopt的基本用法

典型的 getopt使用方式如下:

getopt [options] optstring parameters
  • options: 控制 getopt 的行为的选项,比如是否允许长选项、是否静默模式等。
  • optstring: 指定脚本可以接受的短选项。
  • parameters: 需要解析的命令行参数,通常传递为 "$@"

3、getopt的选项

常用选项包括:

  • -o--options: 指定短选项字符串,例如 -o v:b:c:。每个字符表示一个短选项,如果字符后有冒号 :,则表示该选项需要一个参数。

  • -l--longoptions: 指定长选项列表,用逗号分隔。例如 --longoptions version,help,output:

  • -q--quiet: 静默模式,不显示错误信息。

  • -n--name: 设置 getopt 生成的错误信息中的脚本名称(默认为脚本名称)。

  • -u: 忽略 getopt 自己的错误信息输出。

  • --: 结束选项列表,后面所有参数都被视为位置参数。

4、optstring详解

optstring 定义了允许的短选项,格式如下:

  • 单个字母表示一个短选项,如 v 表示 -v 选项。
  • 如果选项后面有冒号 :,则表示该选项需要一个参数,如 b: 表示 -b 需要一个参数。
  • 两个冒号 :: 表示该选项是可选的参数,这种用法较为少见。

5、示例

假设我们有一个脚本需要处理以下命令行选项:

  • -v--version: 显示版本信息。
  • -b <arg>--batch <arg>: 设置批处理模式。
  • -h--help: 显示帮助信息。
#!/bin/bash# 使用 getopt 解析选项
PARSED_OPTIONS=$(getopt -o vhb: --long version,help,batch: -- "$@")# 如果 getopt 解析出错,退出脚本
if [ $? -ne 0 ]; thenecho "Error parsing options"exit 1
fi# 将解析后的参数设置为位置参数
eval set -- "$PARSED_OPTIONS"# 处理选项
while true; docase "$1" in-v | --version)echo "Version 1.0"shift;;-h | --help)echo "Usage: $0 [options]"shift;;-b | --batch)echo "Batch mode set to $2"shift 2;;--)shiftbreak;;*)echo "Unknown option: $1"exit 1;;esac
done# 处理剩余的位置参数
echo "Remaining arguments: $@"

说明

  • getopt 解析选项:

    • getopt -o vhb: --long version,help,batch: -- "$@"
      • -o vhb: 定义了短选项 -v-h-b,其中 -b 需要一个参数。
      • --long version,help,batch: 定义了对应的长选项。
      • "$@" 代表脚本的所有输入参数。
  • eval set -- "$PARSED_OPTIONS":

    • getopt 的输出会被重新解析,并设置为脚本的位置参数。
  • while true; do 循环解析参数**:

    • 通过 case 语句处理每个选项,根据需要执行不同的操作。
  • 处理剩余的位置参数:

    • 脚本会在 -- 之后处理所有剩余的非选项参数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Mysql】第一章 (环境配置)
  • SpringBoot简单项目(二维码扫描)
  • JVM—虚拟机类加载时机与过程
  • C++之类和对象(上)
  • uniapp打开地图直接获取位置
  • SpringBoot中的server.context-path
  • Spring Boot 整合 Dubbo3 + Nacos 2.4.0【进阶】+ 踩坑记录
  • docker部署hadoop集群
  • 3D,从无知到无畏
  • 使用ChatGPT4o+colab+gradio+huggingface1小时内,完成快速搭建任何AI应用程序或网站【详细教程步骤】建议收藏
  • 11个行为型模式
  • 【Python问题集锦】如何对不规则的时间序列进行对齐和插值
  • Sqlserver 备份表
  • 扩散模型系列笔记(一)——DDPM
  • 拦截指定http请求头,请求参数,请求方法,保存到本地
  • 【笔记】你不知道的JS读书笔记——Promise
  • JavaScript学习总结——原型
  • laravel with 查询列表限制条数
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • oldjun 检测网站的经验
  • Redash本地开发环境搭建
  • Spring Boot MyBatis配置多种数据库
  • spring boot 整合mybatis 无法输出sql的问题
  • tensorflow学习笔记3——MNIST应用篇
  • vue数据传递--我有特殊的实现技巧
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 什么软件可以剪辑音乐?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用 Docker 部署 Spring Boot项目
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序 setData 学问多
  • 《码出高效》学习笔记与书中错误记录
  • kubernetes资源对象--ingress
  • 阿里云重庆大学大数据训练营落地分享
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ‌JavaScript 数据类型转换
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • $GOPATH/go.mod exists but should not goland
  • (07)Hive——窗口函数详解
  • (175)FPGA门控时钟技术
  • (5)STL算法之复制
  • (70min)字节暑假实习二面(已挂)
  • (AngularJS)Angular 控制器之间通信初探
  • (c语言)strcpy函数用法
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (七)glDrawArry绘制
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一) 初入MySQL 【认识和部署】
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)Sublime Text3配置Lua运行环境