网易首页 > 网易号 > 正文 申请入驻

如何在 Bash shell 脚本中解析命令行选项 | Linux 中国

0
分享至

导读:给你的 shell 脚本添加选项。

本文字数:2720,阅读时长大约: 3分钟

https://linux.cn/article-13730-1.html
作者:Seth Kenlon
译者:unigeorge

终端命令通常具有 ,用户可以使用它们来修改命令的执行方式。关于命令行界面的 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 中。

与大多数语言一样,有若干种方法可以解决 Bash 中解析选项的问题。但直到今天,我最喜欢的方法仍然是我从 Patrick Volkerding 的 Slackware 构建脚本中学到的方法,当我第一次发现 Linux 并敢于冒险探索操作系统所附带的纯文本文件时,这些脚本就是我的 shell 脚本的引路人。

Bash 中的选项解析

在 Bash 中解析选项的策略是循环遍历所有传递给 shell 脚本的参数,确定它们是否是一个选项,然后转向下一个参数。重复这个过程,直到没有选项为止。

  1. #!/bin/bash

  2. while [ True ]; do

  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then

  4. ALPHA=1

  5. shift 1

  6. else

  7. break

  8. fi

  9. done

  10. echo $ALPHA

在这段代码中,我创建了一个 循环,它会一直进行循环操作,直到处理完所有参数。 语句会试着将在第一个位置($1)中找到的参数与--alpha-a匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用--verbose-v来触发详细输出)。

关键字会使所有参数位移一位,这样位置 2($2)的参数移动到位置 1($1)。处理完所有参数后会触发 语句,进而中断 循环。

在脚本的末尾,$ALPHA的值会输出到终端。

测试一下这个脚本:

  1. $ bash ./test.sh --alpha

  2. 1

  3. $ bash ./test.sh

  4. $ bash ./test.sh -a

  5. 1

可以看到,选项被正确地检测到了。

在 Bash 中检测参数

但上面的脚本还有一个问题:多余的参数被忽略了。

  1. $ bash ./test.sh --alpha foo

  2. 1

  3. $

要想捕获非选项名的参数,可以将剩余的参数转储到 中。

  1. #!/bin/bash

  2. while [ True ]; do

  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then

  4. ALPHA=1

  5. shift 1

  6. else

  7. break

  8. fi

  9. done

  10. echo $ALPHA

  11. ARG=( "${@}" )

  12. for i in ${ARG[@]}; do

  13. echo $i

  14. done

测试一下新版的脚本:

  1. $ bash ./test.sh --alpha foo

  2. 1

  3. foo

  4. $ bash ./test.sh foo

  5. foo

  6. $ bash ./test.sh --alpha foo bar

  7. 1

  8. foo

  9. bar

带参选项

有一些选项需要传入参数。比如,你可能希望允许用户设置诸如颜色或图形分辨率之类的属性,或者将应用程序指向自定义配置文件。

要在 Bash 中实现这一点,你仍然可以像使用布尔开关一样使用 关键字,但参数需要位移两位而不是一位。

  1. #!/bin/bash

  2. while [ True ]; do

  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then

  4. ALPHA=1

  5. shift 1

  6. elif [ "$1" = "--config" -o "$1" = "-c" ]; then

  7. CONFIG=$2

  8. shift 2

  9. else

  10. break

  11. fi

  12. done

  13. echo $ALPHA

  14. echo $CONFIG

  15. ARG=( "${@}" )

  16. for i in ${ARG[@]}; do

  17. echo $i

  18. done

在这段代码中,我添加了一个 子句来将每个参数与--config-c进行比较。如果匹配,名为CONFIG的变量的值就设置为下一个参数的值(这就表示--config选项需要一个参数)。所有参数都位移两位:其中一位是跳过--config-c,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。

下面是新版脚本的测试:

  1. $ bash ./test.sh --config my.conf foo bar

  2. my.conf

  3. foo

  4. bar

  5. $ bash ./test.sh -a --config my.conf baz

  6. 1

  7. my.conf

  8. baz

Bash 让选项解析变得简单

还有一些其他方法也可以解析 Bash 中的选项。你可以替换使用 语句或 命令。无论使用什么方法,给你的用户提供选项都是应用程序的重要功能,而 Bash 让解析选项成为了一件简单的事。

Shell 编程训练营

为了帮助更多的运维工程师掌握 Shell 这门语言,Linux 中国将为大家带来系列公益训练营之 《Shell 编程训练营》,以帮助大家掌握 Shell 编程的精髓和奥义。本次训练营完全免费,得到了阿里云开发者社区的大力支持。

本次课程将会分三天进行授课:

◈ DAY 1:Shell 的基本介绍、常用命令以及 Shell 的流程控制

◈ DAY 2:Shell 中的数组应用、参数处理和函数的应用

◈ DAY 3:Shell 的编码规范、调试 Debug 方案以及公共函数库

在授课过程中, 老师将以实战与理论相结合的方式,带着你学习基础知识,并掌握实战能力。

在本次训练营中,训练营导师将会带着你用三天的时间,从 Shell 的基础开始,一起开发一个 Shell 脚本,帮助你掌握 Shell 编程的精髓,提升你的 Shell 编程能力。

此外,通过 Linux 中国专属渠道报名并完成训练营学习的同学,还将获得一张由 Linux 中国颁发的训练营结业证书、全网可查询的电子证书。并有机会获得一本赠送的最新计算机书籍(共计 30 本,直播时抽取赠送)。

课程安排

  • 授课时间:2021年 9 月 6 日 - 2021 年 9 月 8 日 21:00 - 22:00(为期 3 晚)

  • 授课方式:直播授课,有回放

  • 授课费用:免费授课,无任何费用

  • 上课地点:报名后进入专属钉钉群

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“大不了同归于尽”!当着119个国家的面,俄罗斯直接喊话美国

“大不了同归于尽”!当着119个国家的面,俄罗斯直接喊话美国

星辰故事屋
2024-06-16 18:09:14
爱神归来!埃里克森心脏骤停正好1100天后,在欧洲杯破门

爱神归来!埃里克森心脏骤停正好1100天后,在欧洲杯破门

直播吧
2024-06-17 00:30:27
陈冰:欧盟拟对中国电动车加征关税 德国为何最先着急?

陈冰:欧盟拟对中国电动车加征关税 德国为何最先着急?

直新闻
2024-06-16 22:32:23
中央开始新一轮严查!这五类人“好日子”到头了,老百姓拍手叫好

中央开始新一轮严查!这五类人“好日子”到头了,老百姓拍手叫好

天下纵览
2024-06-16 13:30:20
中俄联合开发黑瞎子岛,当年黑瞎子岛是怎样被俄方占领的?

中俄联合开发黑瞎子岛,当年黑瞎子岛是怎样被俄方占领的?

浩然史观
2024-06-15 16:55:02
正部级吴英杰被查 曾任西藏自治区党委书记,今年4月还外出调研

正部级吴英杰被查 曾任西藏自治区党委书记,今年4月还外出调研

红星新闻
2024-06-16 19:16:11
欧洲猪肉业界:中国若限制进口将是梦魇

欧洲猪肉业界:中国若限制进口将是梦魇

参考消息
2024-06-16 15:00:11
历史会记住这一天

历史会记住这一天

西楼饮月
2024-06-16 20:49:06
刚向美国否认完“强迫劳动”,宁德时代就被曝要求员工896,奋斗100天

刚向美国否认完“强迫劳动”,宁德时代就被曝要求员工896,奋斗100天

小萝卜丝
2024-06-16 08:32:04
你是不是想死?奔驰车主棍打女骑手,真实身份被扒,评论区沸腾了

你是不是想死?奔驰车主棍打女骑手,真实身份被扒,评论区沸腾了

刚哥说法365
2024-06-16 02:52:08
腾讯有没有被肢解的可能?网友:飞信当年是QQ的最大威胁,决定收费后把自己搞死

腾讯有没有被肢解的可能?网友:飞信当年是QQ的最大威胁,决定收费后把自己搞死

老郭在学习
2024-06-16 23:58:26
打断妻子多根肋骨,上市公司创始人被公诉!

打断妻子多根肋骨,上市公司创始人被公诉!

中国基金报
2024-06-16 00:09:20
科创板IPO|零营收,持续亏损,必贝特提交注册一年后仍未获批

科创板IPO|零营收,持续亏损,必贝特提交注册一年后仍未获批

时代商学院
2024-06-16 17:09:33
2-1!欧洲杯第1场绝杀:荷兰击碎24年魔咒,1米97中锋救主

2-1!欧洲杯第1场绝杀:荷兰击碎24年魔咒,1米97中锋救主

叶青足球世界
2024-06-16 22:53:17
美国女排3-0日本锁定总决赛:中国亚洲第一更稳 世联赛8强全出炉

美国女排3-0日本锁定总决赛:中国亚洲第一更稳 世联赛8强全出炉

颜小白的篮球梦
2024-06-16 19:28:53
变天了?英国《经济学人》头条:中国已成为科学的超级大国

变天了?英国《经济学人》头条:中国已成为科学的超级大国

互联网大聪明
2024-06-16 03:04:28
上影节红毯:俞飞鸿全场最美,娜扎纯美吸睛,《解密》剧组好养眼

上影节红毯:俞飞鸿全场最美,娜扎纯美吸睛,《解密》剧组好养眼

肥罗大电影
2024-06-16 01:37:27
土地卖不动以后,为了保障体制内的工资,许多地方开始“大甩卖”

土地卖不动以后,为了保障体制内的工资,许多地方开始“大甩卖”

庞明说财经
2024-06-16 17:00:58
智利正式申请加入《区域全面经济伙伴关系协定》

智利正式申请加入《区域全面经济伙伴关系协定》

界面新闻
2024-06-16 07:10:30
乌克兰外长:俄方就停火提出的要求不可接受

乌克兰外长:俄方就停火提出的要求不可接受

环球网资讯
2024-06-16 19:53:13
2024-06-17 02:18:44
Linux
Linux
Linux 中国开源社区
8016文章数 73123关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

亲子
数码
本地
家居
公开课

亲子要闻

玩这个游戏的都是勇士

数码要闻

PCIe 5.0 SSD终于要便宜了!群联E31T主控无缓存能跑12GB/s

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

家居要闻

空谷来音 朴素留白的侘寂之美

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版