在Bash中解析命令行参数的两种样例脚本

文章目录

    • 问题
    • 回答
      • 以空格分隔选项和参数
      • 以等号分隔选项和参数
    • 参考

问题

假设,我有一个脚本,它会被这样一行调用:

./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile

或者这个:

./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile

如何解析 $v$f$d,使它们都被设置为 true,并且 $outFile 等于 /fizz/someOtherFile ?


回答

以空格分隔选项和参数

样例程序如下:

cat >/tmp/demo-space-separated.sh <<'EOF'
#!/bin/bashPOSITIONAL_ARGS=() #初始化一个空数组,用来存储位置参数while [[ $# -gt 0 ]]; do  #当命令行参数的数量大于0时,进入循环case $1 in-e|--extension)  #如果参数是这个,脚本会将紧随其后的参数(文件扩展名)保存在变量 EXTENSION 中EXTENSION="$2"shift # 跳过参数shift # 跳过后面的值;;-s|--searchpath)  #如果参数是这个,脚本会将紧随其后的参数(搜索路径)保存在变量 SEARCHPATH 中SEARCHPATH="$2"shift # 跳过参数shift # 跳过后面的值;;--default)  #如果参数是这个,脚本会将变量 DEFAULT 设置为 YESDEFAULT=YESshift # 跳过参数;;-*|--*)  #如果参数是以 - 或 -- 开头且未知的选项,打印错误信息并退出echo "Unknown option $1"exit 1;;*)  #对于所有其他非选项参数(即位置参数),将它们逐一添加到 POSITIONAL_ARGS 数组中,POSITIONAL_ARGS+=("$1") # 保存位置参数shift;;esac
doneset -- "${POSITIONAL_ARGS[@]}" # 将数组里的参数设置为当前 shell 的位置参数echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "DEFAULT         = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)if [[ -n $1 ]]; thenecho "The non option arguments are:" $@
fi
EOFchmod +x /tmp/demo-space-separated.sh/tmp/demo-space-separated.sh -e log -s /var/log pos1 pos2

复制粘贴上述代码块的输出:

在这里插入图片描述

推荐用法:

demo-space-separated.sh -e log -s /var/log pos1

以等号分隔选项和参数

样例程序如下:

cat >/tmp/demo-equals-separated.sh <<'EOF'
#!/bin/bashfor i in "$@"; do  #循环遍历所有的命令行参数case $i in-e=*|--extension=*)EXTENSION="${i#*=}"  #使用 ${i#*=} 来提取等号 = 后面的值(即文件扩展名),并将其保存在变量 EXTENSION 中shift # past argument=value;;-s=*|--searchpath=*)SEARCHPATH="${i#*=}"shift # past argument=value;;--default)DEFAULT=YESshift # past argument with no value;;-*|--*)echo "Unknown option $i"exit 1;;*);;esac
done  #结束for循环echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "DEFAULT         = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)if [[ -n $1 ]]; thenecho "The non option arguments are:" $@
fi
EOFchmod +x /tmp/demo-equals-separated.sh/tmp/demo-equals-separated.sh -e=log -s=/var/log pos3 pos4

其中 ${i#*=} 用于删除参数 $i 从左边开始匹配的第一个 = 及其左边的所有字符。

复制粘贴上述代码块的输出:

在这里插入图片描述

推荐用法:

demo-equals-separated.sh -e=log -s=/var/log pos1 pos2

参考

  • stackoverflow question 192249
  • https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin
  • https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion

相关阅读:

  • sh和Bash的区别
  • 2>&1是什么意思
  • 为什么我不能在脚本中使用“cd“来更改目录
  • 为什么Bash中的“[“和“]“周围应该有空格
  • 如何使用bash脚本并行运行多个程序
  • 为什么要使用xargs命令

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

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

相关文章

【NumPy】NumPy实战入门:索引与切片(sort、argsort、searchsorted)详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

[NOIP 2014] 寻找道路

[NOIP 2014] 寻找道路 在有向图 G 中&#xff0c;每条边的长度均为 11&#xff0c;现给定起点和终点&#xff0c;请你在图中找一条从起点到终点的路径&#xff0c;该路径满足以下条件&#xff1a; 路径上的所有点的出边所指向的点都直接或间接与终点连通。在满足条件 11 的情…

全局查询筛选器适用场景 以及各场景示例

EF Core中的全局查询筛选器&#xff08;Global Query Filters&#xff09;是一种强大的功能&#xff0c;可以在实体框架的DbContext级别为特定的EntityType设置默认的过滤条件。这些筛选器自动应用于所有涉及到相关实体的LINQ查询中&#xff0c;无论是直接查询还是通过Include或…

统计计算四|蒙特卡罗方法(Monte Carlo Method)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 文章目录 系列文章目录一、基本概念&#xff08;一&#xff09;估算 π \pi π&#xff08;二&…

【设计模式】JAVA Design Patterns——Commander(指挥官模式)

&#x1f50d;目的 用于处理执行分布式事务时可能遇到的所有问题。 &#x1f50d;解释 处理分布式事务很棘手&#xff0c;但如果我们不仔细处理&#xff0c;可能会带来不想要的后果。假设我们有一个电子商务网站&#xff0c;它有一个支付微服务和一个运输微服务。如果当前运输…

学习图形推理

学习图形推理 1.位置规律1.1平移1.2翻转、旋转2.样式规律2.1加减异同2.2黑白运算3.属性规律3.1对称性3.2曲直性3.3开闭性4.数量规律4.1面4.2线数量4.3笔画数4.4点数量4.5素数量5.空间重构5.1相对面5.2相邻面-公共边5.3相邻面-公共点5.4相邻面-画边法题型 一组图:从左往右找规律…

编程-辅助工具-Git下载

文章目录 1、前言2、Git官网地址3、迅雷下载 1、前言 采用Git能下载github上的代码&#xff0c;其下载是采用官网下载的&#xff0c;但是下载速度比较慢&#xff0c;网上也推荐了镜像的方式&#xff0c;但是有些链接失效了&#xff0c;突然有一天想起用迅雷是不是合适&#xf…

DDR基本原理

1. 简介 DDR SDRAM&#xff08;Double Data Rate Synchronous Dynamic Random Access Memory&#xff0c;双数据率同步动态随机存储器&#xff09;通常被我们称为DDR&#xff0c;其中的“同步”是指内存工作需要同步时钟&#xff0c;内部命令的发送与数据传输都以它为基准。DDR…

【社会信用体系1003】 企业违规新解:社会信用环境改善的实证分析!

今天给大家分享的是来自于国内顶级期刊金融研究2023年发表论文——《社会信用环境改善降低了企业违规吗&#xff1f;——来自“中国社会信用体系建设”的证据》所用到的重要数据集&#xff0c;该文章从企业层面探讨了社会信用系统建设对企业违规行为的影响&#xff0c;更精准地…

牛客NC164 最长上升子序列(二)【困难 贪心+二分 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237 思路 贪心二分 所谓贪心&#xff0c;就是往死里贪&#xff0c;所以对于最大上升子序列&#xff0c;结尾元素越小&#xff0c;越有利于后面接上其他的数&#xff0c;也就可能变…

Day6 LeedCode: 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

详细讲解移步: Day6 LeedCode: 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和-CSDN博客 242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相…

Linux中开启路由转发功能

首先查看是否开启 [rootnode1 ~]# cat /proc/sys/net/ipv4/ip_forward 0临时开启 方法一&#xff1a; [rootnode1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [rootnode1 ~]# cat /proc/sys/net/ipv4/ip_forward 1方法二&#xff1a; [rootnode1 ~]# sysctl -w net.ip…

【EXCEL_VBA_基础知识】11 使用VBA数组

课程来源&#xff1a;王佩丰老师的《王佩丰学VBA视频教程》&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 当循环中大量使用需多次计算表达式时&#xff0c;可利用数组简化并提升效率&#xff08;底层逻辑&#xff1a;只算一次&#xff0c;然后结果暂存&#xff0c…

宸极教育FPGA培训怎么样?

宸极教育是做培训的&#xff0c;课程主要包含FPGA&#xff0c;plc&#xff0c;pcb&#xff0c;数字IC模拟IC等方向。 而fpga课程是以就业为导向&#xff0c;课程设置在整个圈内都是很全面的&#xff0c;覆盖面广&#xff0c;既有适合初学者的入门知识&#xff0c;也有挑战性的…

使用 Elasticsearch 作为 Azure OpenAI On Your Data 的向量数据库

作者&#xff1a;来自 Elastic Paul Oremland 背景介绍 最近&#xff0c;微软通过 Azure OpenAI 服务 "On Your Data" 将 Elasticsearch 直接集成到 Azure 中。"On Your Data" 使组织能够利用强大的 AI 模型&#xff08;如 GPT-4 和 RAG 模型&#xff09;…

想知道期权的交易方式有哪些吗?新手必看!

今天期权懂带你了解想知道期权的交易方式有哪些吗&#xff1f;新手必看&#xff01;期权指投资者在支付了一定的权利金之后&#xff0c;将拥有未来某个时间协定价格买入或者卖出的权利。 期权的交易策略方式有哪些&#xff1f; 买入看涨期权&#xff1a; 使用场景&#xff1a…

如何将程序打包成Windows安装包

将程序打包成Windows安装包&#xff0c;可以遵循以下步骤进行&#xff1a; 1. 选择合适的打包工具 安装包制作工具&#xff1a;这些工具如“安装包制作大师”、“Inno Setup”等&#xff0c;提供了可视化的界面&#xff0c;方便选择安装路径、添加快捷方式等&#xff0c;还可以…

C# WPF入门学习主线篇(四)—— Button的常用属性

本期来详细介绍一下WPF中Button组件的属性都有哪些 一、准备阶段 首先&#xff0c;打开我们之前创建好的工程。 这是我们之前几期一起做过的工程&#xff0c;现在重新创建一个button&#xff0c;来熟悉一下他的属性。 选中创建的button&#xff0c;点击属性栏 二、接下来介绍…

敏捷开发最佳实践:反馈管理实践案例

反馈管理是敏捷实践中抓住客户价值的重要方法&#xff0c;发布之后及时获取客户反馈并筛选出最有价值的功能&#xff0c;尽早开发&#xff0c;不断循环这个过程就能牢牢把握需求。本节实践案例中的“ 4CLF&#xff08;机制工具人通道&#xff09;”具体做法&#xff0c;将阐述如…

layui扩展件(xm-select)实现下拉框

layui扩展件&#xff08;xm-select&#xff09;实现下拉框 扩展组件 xm-select 效果图 html代码 <div class"layui-inline"><label class"layui-form-label">职位</label><div class"layui-input-inline" style"wid…