导读:给你的 shell 脚本添加选项。
本文字数:2720,阅读时长大约: 3分钟
https://linux.cn/article-13730-1.html
作者:Seth Kenlon
译者:unigeorge
终端命令通常具有 ,用户可以使用它们来修改命令的执行方式。关于命令行界面的 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 中。
与大多数语言一样,有若干种方法可以解决 Bash 中解析选项的问题。但直到今天,我最喜欢的方法仍然是我从 Patrick Volkerding 的 Slackware 构建脚本中学到的方法,当我第一次发现 Linux 并敢于冒险探索操作系统所附带的纯文本文件时,这些脚本就是我的 shell 脚本的引路人。
Bash 中的选项解析
在 Bash 中解析选项的策略是循环遍历所有传递给 shell 脚本的参数,确定它们是否是一个选项,然后转向下一个参数。重复这个过程,直到没有选项为止。
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
在这段代码中,我创建了一个 循环,它会一直进行循环操作,直到处理完所有参数。 语句会试着将在第一个位置($1
)中找到的参数与--alpha
或-a
匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用--verbose
和-v
来触发详细输出)。
关键字会使所有参数位移一位,这样位置 2($2
)的参数移动到位置 1($1
)。处理完所有参数后会触发 语句,进而中断 循环。
在脚本的末尾,$ALPHA
的值会输出到终端。
测试一下这个脚本:
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
可以看到,选项被正确地检测到了。
在 Bash 中检测参数
但上面的脚本还有一个问题:多余的参数被忽略了。
$ bash ./test.sh --alpha foo
1
$
要想捕获非选项名的参数,可以将剩余的参数转储到 中。
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
测试一下新版的脚本:
$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo
foo
$ bash ./test.sh --alpha foo bar
1
foo
bar
带参选项
有一些选项需要传入参数。比如,你可能希望允许用户设置诸如颜色或图形分辨率之类的属性,或者将应用程序指向自定义配置文件。
要在 Bash 中实现这一点,你仍然可以像使用布尔开关一样使用 关键字,但参数需要位移两位而不是一位。
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done
echo $ALPHA
echo $CONFIG
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
在这段代码中,我添加了一个 子句来将每个参数与--config
和-c
进行比较。如果匹配,名为CONFIG
的变量的值就设置为下一个参数的值(这就表示--config
选项需要一个参数)。所有参数都位移两位:其中一位是跳过--config
或-c
,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。
下面是新版脚本的测试:
$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
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.