首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从源脚本扩展getopts

getopts 是一个在 Unix 和类 Unix 系统中常用的命令行参数解析工具,它可以帮助开发者轻松地处理命令行输入的参数。下面是对 getopts 的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方案的详细解释。

基础概念

getopts 是一个 shell 内置命令,用于解析位置参数。它会循环处理命令行参数,每次调用返回下一个选项及其参数(如果有)。getopts 的语法通常如下:

代码语言:txt
复制
while getopts optstring name; do
    case $name in
        option1) commands ;;
        option2) commands ;;
        ?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;;
        :) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;;
    esac
done

其中,optstring 是一个字符串,定义了有效的选项,如果选项需要参数,则在选项字母后加冒号。

优势

  1. 简洁性:相比手动解析 $@$*getopts 提供了一种更简洁的方式来处理命令行参数。
  2. 易用性:它的使用非常直观,只需几行代码即可实现复杂的参数解析逻辑。
  3. 灵活性:可以轻松地扩展以支持新的选项和参数。

类型

getopts 主要有以下几种类型:

  • 单字符选项:如 -a-b
  • 带参数的单字符选项:如 -f filename
  • 长选项:虽然 getopts 本身不直接支持长选项,但可以通过一些技巧来实现。

应用场景

  • 脚本编程:在编写 shell 脚本时,经常需要处理用户输入的参数。
  • 自动化任务:在自动化部署、数据备份等场景中,命令行参数是传递配置信息的重要方式。

可能遇到的问题及解决方案

问题1:无效选项的处理

当用户输入了未定义的选项时,getopts 会自动设置 $name?,并可以通过捕获这个情况来给出友好的错误提示。

解决方案

代码语言:txt
复制
case $name in
    ?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;;
esac

问题2:缺少必需参数的处理

如果某个选项需要一个参数,但用户没有提供,getopts 会设置 $name:,并可以通过 $OPTARG 获取到缺失参数的信息。

解决方案

代码语言:txt
复制
case $name in
    :) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;;
esac

问题3:扩展以支持长选项

getopts 默认不支持长选项(如 --option),但可以通过一些额外的逻辑来实现。

解决方案

可以使用第三方工具如 getopt 或编写自定义函数来处理长选项。例如,结合 getoptsgetopt 的使用:

代码语言:txt
复制
args=$(getopt -o ab:f: --long option1:,option2:,file: -n 'script.sh' -- "$@")
eval set -- "$args"

while true; do
    case "$1" in
        -a|--option1) echo "Option 1"; shift ;;
        -b|--option2) echo "Option 2"; shift ;;
        -f|--file) echo "File: $2"; shift 2 ;;
        --) shift; break ;;
        *) echo "Internal error!" >&2; exit 1 ;;
    esac
done

通过这种方式,可以充分利用 getopts 的简洁性,同时支持更复杂的长选项需求。

总之,getopts 是一个强大而灵活的工具,适用于各种需要处理命令行参数的场景。通过合理地使用和扩展它,可以大大提高脚本的可维护性和用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Shell脚本中的while getopts用法小结

命令行当中的所有参数都有一个index,第一个参数从1开始,依次类推。 另外有一个名为OPTIND的Shell Variable存放下一个要处理的参数的index。...这个时候我们就可以使用bash内置的getopts工具了,用于解析shell脚本中的参数!...,用来识别非法的选项,进行相应的操作,我们的脚本中输出了帮助信息。 3)getopts示例二:当选项参数识别完成以后,就能识别剩余的参数了,我们可以使用shift进行位移,抹去选项参数。...(用到了getopts),生产环境中可以使用该脚本。...=${ZKCOM_PORT:-3888} #定义公共变量 #zookeep安装包存放位置 ZKSAVDIR="/software/linxin/zookeeper" #zookeeper安装包名(不带扩展名

9.1K74

Linux:中使用getopts处理脚本参数

在Linux中编写Shell脚本时,处理命令行参数是一个常见且重要的任务。getopts是一个用于解析命令行选项的内置命令,它能够帮助我们简化脚本参数的处理过程。...本文将详细讲解如何在Linux脚本中使用getopts来处理脚本参数,并通过示例来展示其实际应用。 一、getopts概述 getopts是一种用于解析命令行参数的工具。...四、示例讲解 以下是一个示例脚本,通过getopts处理-a、-b和-c选项,其中-b选项需要一个参数: sh #!...六、总结 通过getopts,我们可以简化Shell脚本中命令行参数的处理过程。使用getopts不仅可以使代码更清晰,还能自动处理错误情况,提高脚本的健壮性。...希望本文能帮助你更好地理解和使用getopts来处理Linux脚本参数。

65610
  • 从油猴脚本管理器的角度审视Chrome扩展

    从油猴脚本管理器的角度审视Chrome扩展 在之前一段时间,我需要借助Chrome扩展来完成一个需求,当时还在使用油猴脚本与浏览器扩展之间调研了一波,而此时恰好我又有一些做的还可以的油猴脚本 TKScript...那么在后来需求的开发过程中,因为有些能力是类似于脚本管理器提供的基础环境,致使我越来越好奇脚本管理器是怎么实现的,而实际上脚本管理器实际上还是一个浏览器扩展,浏览器也并没有给脚本管理器开后门来实现相关能力...但是实际上这引入了另一个问题,在v3版本的Service Worker不会常驻,所以这个WebSocket链接也会随着Service Worker的销毁而销毁,是比较坑的一点,同样也是因为这一点大量的Chrome扩展无法从...)的注释,其中这个sourceURL会将注释中指定的URL作为脚本的源URL,并在Sources面板中以该URL标识和显示该脚本,这对于在调试和追踪代码时非常有用,特别是在加载动态生成的或内联脚本时。...那么解决这个问题的方式也比较简单,很明显在这里发起的通信并不是直接从页面的window发起的,而是从浏览器扩展发出去的,所以在这里我们就需要讨论如何做到在用户页面与浏览器扩展之间进行通信的问题。

    28810

    shell脚本扩展「建议收藏」

    如: $ grep –A 1 panda file (从file中搜寻有panda样式的行,并显示该行的后1行) 2....禁止默认输出,只打印找到north的行 nl /etc/passwd | sed -n ‘5,7p’ 仅列出/etc/passwd文件中的第5~7行内容 注:sed 的-i选项可以直接修改文件中的内容 6.扩展...命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中接受输入,一般是键盘或重定向结果。...2 awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取) 3 awk将读入的记录分割成字段,将第1个字段放入变量1中,第2个字段放入2,以此类推。...可以使用del.lines ––help获得一个简短的帮助 保存后给脚本文件增加执行权限:chmod +x del.lines 执行脚本进行测试: 注: 1、basename命令能够从路径中分离出文件名

    5.8K20

    Garadle 插件扩展属性&源集SourceSets

    插件扩展 原因 为什么需要插件扩展?插件内部执行任务的时候需要依赖外界脚本传入的值进行相对应的构建。 也就是说插件里面的属性需要从外部拿到,外部去设置这些属性。...具体步骤 添加扩展属性 插件通过apply引入,在配置阶段会执行plugin的apply方法,方法内部定义扩展属性使用 第一个参数代表扩展属性的名称,第二个参数的名称代表接收的class类型 //....属性名称获取,脚本中直接设置。...简写为ext,这就是为什么可以直接在脚本中拿到ext里面的属性值 为什么可以使用闭包设置扩展属性呢?...原因是gradle为每个扩展属性都添加了一个配置的闭包,因此可以通过闭包设置扩展属性 使用扩展属性 配置阶段中先引入插件,在插件的apply方法添加了扩展属性后;接着脚本继续往下执行设置了扩展属性,

    40120

    kangle安装fileinfo扩展思路,脚本

    前言 最近玩cms需要fileinfo扩展,于是乎开始了折腾 鉴于配置比较麻烦,这里给出了一份脚本 查看已安装php版本 cd /vhs/ext/ ls Shell 复制 里面有对应的php版本,可根据脚本思路进行修改安装...在此获取php下载:https://github.com/1265578519/kangle/tree/master/php PHP7.1.13模版 有空再写其他版本的吧 注意:在执行此脚本前,请确保您安装的...PHP7.1.13,如未安装,请先安装: PHP7.1.13安装脚本wget http://github.itzmx.com/1265578519/kangle/master/php/7.1/7113/...completed/tpl_php7113.sh -O tpl_php7113.sh;sh tpl_php7113.sh Shell 复制 PHP7.1.13 fileinfo扩展脚本 wget https...://github.com/moehu/shell/raw/master/php7.1.13-fileinfo.sh;sh php7.1.13-fileinfo.sh Shell 复制 脚本注释 (可以根据说明修改自己对应的

    78670

    Ubuntu 系统自动 apt 换源脚本

    - shell 脚本写入文件操作 - shell 脚本备份文件操作 - shell 脚本更新操作 - 完整脚本代码 shell 文件写入操作 shell 脚本编写的时候,可以在文件的开头声明所使用的 bash...echo 命令完成,值得注意的是,写入文件的操作有两种方式,分别是 > 和 >>,它们的区别如下: - >> 将内容写入文件,覆盖原有内容 - > 将内容写入文件,追加到文件尾部 那么,使用 shell 脚本向文件写入内容的方法如下...使用 shell 脚本完成备份文件和直接备份差不多,以备份更新源为例子,代码如下: #!.../bin/bash # 这里的脚本需要配合 sudo 使用 cp /etc/apt/sources.list /etc/apt/sources.list.bak shell 脚本完成 apt 更新操作.../bin/bash apt update # 更新源 apt upgrade -y # 更新软件 完成的 shell 脚本代码 #!

    2.5K10

    Garadle 插件扩展属性&源集SourceSets

    theme: condensed-night-purple 插件扩展 原因 为什么需要插件扩展?插件内部执行任务的时候需要依赖外界脚本传入的值进行相对应的构建。....属性名称获取,脚本中直接设置。...简写为ext,这就是为什么可以直接在脚本中拿到ext里面的属性值 为什么可以使用闭包设置扩展属性呢?...原因是gradle为每个扩展属性都添加了一个配置的闭包,因此可以通过闭包设置扩展属性 使用扩展属性 配置阶段中先引入插件,在插件的apply方法添加了扩展属性后;接着脚本继续往下执行设置了扩展属性,...gradle自带插件 下图列出了不同插件对应的插件入口类,接下来读者可通过这些入口类找到这些插件配置了哪些扩展属性 grovvy学习之源集Sourcesets 定义 源集表示一组用于编译执行的源文件,

    48120

    几个有意思的扩展脚本

    最近又发现几个有意思的chrome扩展/脚本, 这里再整理下,之前分享过的扩展我都更新到博客上了https://sushengbuhuo.github.io/blog 。...对百度搜索同样有效: 类似的还有油猴脚本 https://greasyfork.org/zh-CN/scripts/1682 基于书签的新标签页 这个扩展将你收藏夹的书签展示在新标签页 https:...chrome.google.com/webstore/detail/search-by-image/cnojnbdhbhnkbcieeekonklommdnndci/related 类似的还有这个油猴脚本...E8%83%BD%E7%BD%91%E9%A1%B5%E5%A4%A7%E7%BA%B2/ppdjhggfcaenclmimmdigbcglfoklgaf ,以这篇文章为例整理下苏生不惑开发过的那些软件和脚本...类似的还有这个油猴脚本 https://greasyfork.org/scripts/406337 自动剪切板 这个扩展可以选中文字自动复制,破解禁止选择、禁止复制,支持各种文库和网站,还可以查看剪切板历史记录

    70730

    SHELL(bash)脚本编程四:其他扩展

    在之前的文章中我们讲述了变量扩展、数学扩展和命令替换。本篇接着介绍shell中用到的其他扩展。 历史扩展 默认时,在交互式shell环境下,bash允许对历史命令进行记录和扩展。...-16 20:16:41] export HISTTIMEFORMAT="[%F %T] " 1013 [2017-01-16 20:16:52] history |tail -2 由于在bash脚本中...默认时shell脚本中不能使用别名。别名扩展是完全基于文本的,因而别名可以改变shell语法。几乎任何别名的作用,都可以用shell函数来实现。 大括号扩展 大括号扩展是一种生成任意字符串的机制。...在脚本中使用后台执行命令时需要注意,如果当前shell先于后台进程退出,会导致后台进程也随之退出(此时并没有执行完)。如果需要等待后台进程退出后父进程才退出,可以使用内置命令wait。...脚本举例: #!/bin/bash #定义C段地址数组 c=(1 2 3 4 5) #测试连通性函数 function ping_ip() { ping -c3 10.0.$i.

    75730

    Linux Shell编程入门

    然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。...sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。...exit 1;; esac done 上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。...getopts的语法如下: getopts option_string variable option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与...第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。

    1.2K10

    使用php脚本查看已开启的扩展

    正式线phpinfo()函数被禁用,但又想知道PHP安装了那些扩展,怎么办呢? php安装时会将扩展包编译进去,对于一个正在运行中的数据库,查看php的扩展开启状况, 第一种:是通过配置文件查看。...第三种:在 CLI 命令行脚本中,我们可以使用 php -m 命令来查看已加载的扩展。 第四种:使用php内置函数来查看,通过脚本输出来查看,代码如下:   通过get_loaded_extensions函数可以返回php扩展开启情况的一个数组,然后可以打印出来   通过查看源代码可以清晰地看出扩展的开启情况: 另外, PHP 也为我们提供了在动态运行期间可以查看扩展状态的函数...查看是否已经加载了扩展 echo extension_loaded("redis"); // 1 非常简单的一个函数,它的作用就是检查一个扩展是否已经加载。...它返回的是一个布尔值,当扩展已经加载则返回 true ,如果扩展没有加载,则返回 false 。

    3.2K30

    getopts(1) builtin command

    对于一些只需要很简单的命令行参数的脚本,通过使用N形式轻松的完成解析,但对于比较复杂的命令行形式的参数,就需要脚本的编写者在脚本中加入复杂的代码对命令行入参进行解析。...为了减少重复性编程和简化命令行参数处理的过程,Shell 为脚本编写者提供了一些命令行处理方法,使用这些方法可以轻松的处理各种形式的命令行参数。 常用的是 getopts 和 getopt。...在 Shell 脚本中使用时,默认解析的是执行 Shell 脚本传入的参数,所以这个部分可省略不写。 3.选项 无。 4.返回值 如果找到指定或未指定的选项,getopts 将返回 true。...OPTIND OPTIND 是 getopts 内建变量,用于表示下一个要处理的参数的索引位置,从 1 开始。getopts 处理选项时会自动更新 OPTIND。...6.示例 使用 getopts,编写一个 Shell 脚本,可支持识别命令行选项 -b、-o、-h。其中,-b 和 -o 选项后需要跟一个参数。 #!

    14610

    如何为 Gradle 的 KTS 脚本添加扩展?

    现在我们的 Gradle 脚本都迁移到 KTS 了。接下来我们要考虑的问题是,能不能添加一些好用的扩展,方面后续脚本的编写?...但在 Kotlin 这里情况就显得有点儿麻烦了,因为我们添加的扩展要在编译的时候就能够让编译器访问到。 1. Kotlin DSL 的 Gradle 脚本是怎么运行的?...为了搞清楚怎么添加扩展,我们同样需要搞清楚采用 Kotlin DSL 的 Gradle 脚本是怎么运行的。...$$result = (Delete)var9; } } 截止目前,我想大家应该能够明白 Gradle Kotlin DSL 脚本是如何运行的了。 接下来我们就看看如何实现扩展的定义。 2....至此,我们实现了为整个工程的构建脚本定义扩展。这一点与我们在 buildSrc 当中定义依赖的版本常量的思路实际上也是一致的。

    1.4K20

    在SSM项目中扩展配置多数据源

    这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情 一个ssm项目中需要扩展多个数据源,原来只有一个mysql,现在需要再扩展一个mysql,现将需要改动的地方做一个记录。...db.properties修改 首先,需要在数据源配置文件中增加新数据源配置。因为都是mysql,除了需要改动的,其他配置都是用了一样的参数,如果需要更改,可以自行增加配置参数。...,以及多源数据库如何选择的配置。 ​...AbstractRoutingDataSource 类:可以根据用户定义的规则选择当前的数据源,多源数据库需要使用该类实现多源数据库选择。...这里可以利用aop,实现根据包名自动切换数据源。 切面类 db1数据源都在db1包名下,db2数据源都在db2数据源下。

    16110
    领券