Linux shell getopts 解析命令行参数

getopts

语法
getopts 选项字符串 名称 [ 参数 ...]


示例1(有前置冒号): 
while getopts ":hdo:" optname;
do
......
done

示例1(无前置冒号)
while getopts "hdo:" optname;
do
......
done

说明:

optstring  选项字符串,即 option 字符串,会逐个匹配
varname    变量名称,保存每次匹配成功的选项
arg        参数列表,没写时它会取命令行参数列表
$OPTIND    特殊变量/全局变量,option index,会逐个递增
$OPTARG    特殊变量/全局变量,option argument,不同情况下有不同的值

注意:
1)当 optstring 以 : 开头时(有前置冒号),getopts 会区分 illegal option 错误(非法选项)和 option requires an argument 错误(选项缺少参数)。
illegal option(非法选项)时,varname 会被设成 ?(问号) ,$OPTARG 保存出问题的 option;
option requires an argument(选项缺少参数) 时,varname会被设成 :(冒号) ,$OPTARG 保存出问题的 option;

2)当 optstring 无 : 开头时(无前置冒号),illegal option 错误(非法选项)和 option requires an argument 错误(选项缺少参数)都会使 varname 被设成 ?(问号),$OPTARG 保存出问题的 option;

3)当 optstring 中的字符后面跟 ”:“ 时(有后置冒号),表明该 option 要接收参数,参数(argument)保存在 $OPTARG 中;
如果缺参数,且 optstring 是以”:“开头(有前置冒号),则 varname 的值会被设置成 :(冒号),$OPTARG 保存了该 option;
否则 varname 的值是 ?(问号),$OPTARG 保存了该 option。

每次调用 getopts 命令时,它将下一个选项的值放置在名称内,并将下一个要处理的参数的索引置于 shell 变量 OPTIND 中。一旦调用了shell , OPTIND 将初始化为 1。
如果选项字符串中的字符后面带有 : (有后置冒号),则预期此选项将带有参数。当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中。

当查找到选项字符串所不包含的选项字符(即不支持的选项),或者查找到的选项没有所需的选项参数时(即虽然选项支持,但选项需要参数,参数却没有传入):
1)如果选项字符串不以前置 :(前置冒号)开头,名称 将会被设置为 ?(问号)字符,OPTARG 将被取消设置,并且诊断消息将被写入到标准错误中。
2)如果选项字符串以前置 :(前置冒号)开头,名称 将被设为 ?(问号)字符,这是对不支持的选项来说的,或者为缺少参数的所需选项设为:(冒号)字符,OPTARG 将被设置为已查找到的选项字符,并且 标准错误中将不写入任何输出。

示例:

#!/bin/bash#java21 -jar mcp-server-mysql-webmvc-0.0.1-SNAPSHOT.jar --datasource.config=./datasource.ymlfile="mcp-server-mysql-webmvc-0.0.1-SNAPSHOT.jar"
# pnamekey used by getPid for find process by name, eg: mcp-server-mysql-webmvc
pnamekey=$(echo $file | sed -E s/-[0-9\.]+.*//g)
java_opt_default="--datasource.config=./datasource.yml"
java_opt=""
pid=
args=""# init 
h_idx=-1
d_idx=-1
o_idx=-1
o_val=""function showHelp() {echo -e "\n***********************************************************************\n"echo -e "Use $0 [ -h | [ -d ] [ -o java_run_option ] ] \n"echo -e "    -h: show help"echo -e "    -d: enable debug server, default port is 5005"echo -e "    -o: special java run option, if not special -o, default behavior is: -o $java_opt_default"echo -e "\n  eg: "echo -e "    $0 -h    # show help"echo -e "    $0       # run without args"echo -e "    $0 -o $java_opt_default    # run with special java run option"echo -e "    $0 -d    # run with enable debug server"echo -e "    $0 -d -o $java_opt_default    # run with enable debug server and special java run option"echo -e "\n***********************************************************************\n"
}while getopts ":hdo:" optname;
docase "$optname" inh)h_idx=$OPTINDshowHelpexit 0;;d)d_idx=$OPTIND;;o)o_idx=$OPTINDo_val=$OPTARG;;:)echo "Option[$(expr $OPTIND - 1)] -$OPTARG required an argument"exit 1;;?)echo "Invalid option[$(expr $OPTIND - 1)]: -$OPTARG"exit 1;;*)# should not occurecho "Invalid option[$(expr $OPTIND - 1)]: -$OPTARG"exit 1;;esac
doneif [ $d_idx -ne -1 ]; then# enable debug if input args inluce "-d" optionecho "enable debug server"args="$args -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5005"
fiif [ $o_idx -eq -1 ]; thenjava_opt=$java_opt_default
elsejava_opt=$o_val
fifunction getPid() {local name=$1pid=$(ps aux |grep $name |grep -v "grep" | awk '{print $2}')
}# check already is running
getPid $pnamekey
if [ -n "$pid" ]; thenecho -e "\n$pnamekey already is running, pid = $pid \n"exit
fiecho -e "\njava21 $args -jar $file 2>&1 &"
#nohup java21 $args -cp $file $class 2>&1 &
java21 $args -jar $file 2>&1 &# check run success/failed
getPid $pnamekey
if [ -z "$pid" ]; thenecho -e "$pnamekey start failed!\n"exit
elseecho -e "$pnamekey start success! pid = $pid\n"
fi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97539.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97539.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97539.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepInteraction++基于多模态交互的自动驾驶感知与规划框架

DeepInteraction++基于多模态交互的自动驾驶感知与规划框架 1 论文核心概念 DeepInteraction++ 提出了一种名为"模态交互"(modality interaction)的新策略,用于自动驾驶中的多模态(LiDAR 和相机)感知任务。其核心思想是不将多模态信息融合为单一表示,而是分别…

忆联参与制定消费级SSD团体标准正式出版! 以“高可靠”引领行业提质增效与用户体验升级

引言​在AIPC爆发、数据价值凸显的当下,存储设备已超越简单容器,成为智能体验基石,其性能与可靠性直接关乎用户效率与资产安全。然而,消费级SSD长期缺乏统一权威的可靠性标准,使厂商缺乏质量对标依据,用户亦…

微服务搭建(SpringBoot + Dubbo + Nacos)

1.项目接口2. 编辑pom.xml和application.yml文件2.1父工程pom.xml<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:s…

android中常见布局及其约束

0 布局的定义 布局可以理解为一种​​容器​​&#xff0c;用于​​组织与排列界面上的控件​​。 布局是一个相框&#xff0c;控件就是你要展示的照片。• 你&#xff08;布局规则&#xff09;决定这些照片怎么排列&#xff1a;是从上到下整齐放&#xff08;LinearLayout&am…

Rust语言能干什么

Rust 语言的应用范围非常广&#xff0c;几乎覆盖了现代软件开发的全部领域。它最初以“系统级语言”身份出道&#xff0c;但现在已经远远超出了这个范畴。下面我从几个关键方向给你梳理一下&#xff0c;Rust 到底能干什么&#xff0c;以及为什么在这些领域它特别有优势。 1. 系…

只需一个设置就可以解决Microsoft Edge浏览器打不开网页的问题

Microsoft Edge是一款功能强大的网络浏览器&#xff0c;预装在Windows 10、11系统中。通过这个简单易懂的教程&#xff0c;学习如何修复Microsoft Edge浏览器打不开的问题。1、打开计算机找到C盘&#xff0c;双击打开&#xff1a;2、打开【用户】➜【Admin】➜【AppData】➜【L…

AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手源码

文章的目的为了记录AI应用学习的经历&#xff0c;降低AI的入门难度。同时记录开发流程和要点有些记忆模糊&#xff0c;防止忘记。也希望可以给看到文章的朋友带来一些收获。 相关链接&#xff1a; AI 应用 图文 解说 (一) -- 百度智能云 实现 语音 聊天-CSDN博客 AI 应用 图文 …

计算机Python毕业设计推荐:基于Django的博客网站设计与实现【python/大数据/深度学习/机器学习定制】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二、…

当 AI 开始 “筛选” 信息:算法偏见会加剧认知鸿沟吗?如何构建公平的 AI 生态?

AI 筛选信息的现状与原理​在信息爆炸的时代&#xff0c;AI 筛选信息已成为各领域不可或缺的关键技术。在社交媒体平台上&#xff0c;如抖音、小红书等&#xff0c;AI 根据用户的点赞、评论、浏览历史等数据&#xff0c;精准推送用户可能感兴趣的内容&#xff0c;极大提升了用户…

2023年IEEE IOTJ SCI1区TOP,动态环境下无人机目标覆盖任务路径规划,深度解析+性能实测

目录1.摘要2.问题模型3.算法设计4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 无人机&#xff08;UAV&#xff09;作为物联网应用的重要工具&#xff0c;正广泛应用于智能农业监测、智能交通监测等领域&#xff0c;并逐渐成为国内外研究热点。然而&#x…

计算机视觉(四):二值化

二值化&#xff0c;就是将图像从彩色或灰度模式转换为只有两种颜色&#xff08;通常是黑色和白色&#xff09;的模式。这个过程的本质是设定一个阈值 (Threshold)&#xff0c;将图像中所有像素的灰度值与这个阈值进行比较。 基本原理 二值化的核心原理非常简单&#xff1a; 灰度…

(二)设计模式(Command)

文章目录项目地址一、设计模式1.1 Command Design1. 创建命令接口2. 创建支付的Command类3. CommandScheduler4. 使用1.2 Chain of Responsibility1. 接口创建2. 审批人3. 发起审批1.3 State Pattern1. 创建简单的状态机定义动作和状态状态机使用状态机1.x Iterator1.x Observe…

现代C++性能陷阱:std::function的成本、异常处理的真实开销

1. std::function 的成本 std::function 是一个通用的、类型擦除的函数包装器&#xff0c;它非常方便&#xff0c;可以存储和调用任何可调用对象&#xff08;函数、lambda、函数对象、bind表达式等&#xff09;。然而&#xff0c;这种灵活性是有代价的。 主要成本来源&#xff…

基于Spark的白酒行业数据分析与可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍一、项目背景与研究意义二、系统整体架构三、系统功能设计四、应用场景与价值五、项目特色与创新点六、总结与展望每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部…

织梦会员中心模板调用某个栏目名和栏目下文档的办法

大家在用到织梦dedecms时候&#xff0c;需要在会员中心模板调用栏目的名称和链接&#xff0c;还有某个栏目下的文档要怎么操作呢&#xff1f; 我们都知道&#xff0c;在会员中心模板&#xff0c;直接用dede:type或者dede:arclist标签是不行的&#xff0c;在会员中心调用只能用p…

区块链的法律定位:技术、工具还是资产?

高鹏律师首席数据官&#xff0c;数字经济团队创作AI辅助当我们谈论区块链时&#xff0c;我们在谈论什么&#xff1f;是那串不可篡改的哈希值&#xff0c;是去中心化的信仰图腾&#xff0c;还是藏在代码背后的权利密码&#xff1f;今天&#xff0c;我们不聊技术迭代的炫酷&#…

LeetCode每日一题,2025-8-31

dfs搜索解数独&#xff0c;重点是如何判断当前这位置的board[x][y]是否可以填数字num public class T37 {public static void main(String[] args) {char[][] board new char[][]{{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, …

Linux 进程信号学习笔记:从概念到实操

一、Linux 信号基本概念1.1 生活角度理解信号我们可以把进程比作等待快递的人&#xff0c;信号就像快递&#xff1a;识别信号&#xff1a;就像我们知道快递来了该 怎么处理&#xff0c;进程对信号的识别是内核程序员预先编写的内置特性&#xff0c;即使信号没产生&#xff0c;进…

解决多种类潮湿敏感元器件的多温度、多时长的排潮烘干

铠德科技ESD烘箱针对复杂电路产品的排潮烘干需求&#xff0c;可通过以下技术路径实现多品类元器件的高效兼容处理&#xff1a;多温区独立控制系统采用蜂窝式加热模块阵列&#xff0c;每个0.6m独立温区可设置1℃精度支持同时运行3种不同温度曲线&#xff08;典型值&#xff1a;8…

obdumper和obloader迁移OceanBase业务库(一):实施手册

obdumper和obloader迁移OceanBase业务库&#xff08;一&#xff09;&#xff1a;实施手册导出前准备全库&#xff08;模式&#xff09;数据导出全库&#xff08;模式&#xff09;数据导入导入后检查环境信息&#xff1a;OceanBase v4.3.5单机部署&#xff0c;MySQL租户OBDUMPER…