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

在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命令

相关文章:

  • layui table在不发送请求时更新templet操作列
  • 小程序唯品会Authorization sign
  • 使用html2canvas和jspdf导出pdf包含跨页以及页脚
  • 回答网友问题:在C# 中调用非托管DLL
  • 基于Spring 框架中的@Async 注解实现异步任务
  • Spring Aware接口:揭秘Bean生命周期中的“先知”角色与源码剖析
  • 第十三届蓝桥杯国赛大学B组填空题(c++)
  • window安装ffmpeg播放本地摄像头视频
  • Java面试进阶指南:高级知识点问答精粹(一)
  • Gitlab不允许使用ssh拉取代码的解决方案
  • 【NVM】持久内存的架构
  • vue3中element-plus下拉菜单与图标的使用
  • 22-LINUX--多线程and多进程TCP连接
  • 字节跳动(校招)算法原题
  • SQL生成序列浅析
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 2018一半小结一波
  • Android Studio:GIT提交项目到远程仓库
  • Angular数据绑定机制
  • go语言学习初探(一)
  • isset在php5.6-和php7.0+的一些差异
  • Java多态
  • Laravel 菜鸟晋级之路
  • LeetCode18.四数之和 JavaScript
  • mac修复ab及siege安装
  • python docx文档转html页面
  • Python_OOP
  • Python实现BT种子转化为磁力链接【实战】
  • React as a UI Runtime(五、列表)
  • vue--为什么data属性必须是一个函数
  • 第2章 网络文档
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端之Sass/Scss实战笔记
  • 数组大概知多少
  • 我有几个粽子,和一个故事
  • 小程序开发之路(一)
  • 因为阿里,他们成了“杭漂”
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 中文输入法与React文本输入框的问题与解决方案
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # 数据结构
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2020)Java后端开发----(面试题和笔试题)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...