

如何在 Bash shell 脚本中解析命令行选项 | Linux 中国
source link: https://zhuanlan.zhihu.com/p/404690753
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何在 Bash shell 脚本中解析命令行选项 | Linux 中国
给你的 shell 脚本添加选项。
- 来源:https://linux.cn/article-13730-1.html
- 作者:Seth Kenlon
- 译者:unigeorge
(本文字数:2720,阅读时长大约:3 分钟)
终端命令通常具有 选项或开关,用户可以使用它们来修改命令的执行方式。关于命令行界面的 POSIX 规范 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 Bash 脚本 中。
与大多数语言一样,有若干种方法可以解决 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
在这段代码中,我创建了一个 while
循环,它会一直进行循环操作,直到处理完所有参数。if
语句会试着将在第一个位置($1
)中找到的参数与 --alpha
或 -a
匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用 --verbose
和 -v
来触发详细输出)。
shift
关键字会使所有参数位移一位,这样位置 2($2
)的参数移动到位置 1($1
)。处理完所有参数后会触发 else
语句,进而中断 while
循环。
在脚本的末尾,$ALPHA
的值会输出到终端。
测试一下这个脚本:
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
可以看到,选项被正确地检测到了。
在 Bash 中检测参数
但上面的脚本还有一个问题:多余的参数被忽略了。
$ bash ./test.sh --alpha foo
1
$
要想捕获非选项名的参数,可以将剩余的参数转储到 Bash 数组 中。
#!/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 中实现这一点,你仍然可以像使用布尔开关一样使用 shift
关键字,但参数需要位移两位而不是一位。
#!/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
在这段代码中,我添加了一个 elif
子句来将每个参数与 --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 中的选项。你可以替换使用 case
语句或 getopt
命令。无论使用什么方法,给你的用户提供选项都是应用程序的重要功能,而 Bash 让解析选项成为了一件简单的事。
via: https://opensource.com/article/21/8/option-parsing-bash
作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy
Recommend
-
7
使用Shell脚本重复调用命令行生产实践: 使用shell重复调用命令行学习技巧: Shell 判断、循环、fu...
-
9
更新于 2021/08/14 | 创建于 2021/08/13 如何在shell脚本设置当前shell的环境变量 Your shell process has a copy of the pa...
-
7
题外话:不知不觉,达成了llvm-project 1900 commits的成就。 LLVM中命令行选项的处理有两个库。 llvm/Support/ComandLine.h 文档参见https://llvm.org/docs/CommandLin...
-
3
V2EX › 程序员 如何在 Shell 脚本中解析 json 并取出数据? LxnChan ·
-
14
lua脚本可以控制ELRS高频头的属性,比如发射功率, 发射频率,数传包的大小等。 lua脚本的详细的解释在官网中有,链接为:Using The Lua Script – ExpressLRS
-
7
Linux 命令行与 shell 脚本编程大全 Linux 命令行与 shell 脚本编程大全 shell linux posted on 22 Oct 2020 under category note 文中的示例代码, 如果有命令提示符 $...
-
10
Mac如何在shell脚本当中获取时间 | PPmoon's Blog Mac如何在shell脚本当中获取时间 Posted on 2019-08-26 in shell ...
-
6
mongo在shell命令行直接执行js脚本 精选 原创 雍州无名 2022-09-08 08:17:00
-
9
如何在 bash shell 脚本中 echo 一个新行 作者:刘光录 2022-11-03 08:13:52 可以在 echo 命令中使用 -e 选项,这样就可以使用换行符 \n 在同一输出行中打印新行了,下面我们来详细了解一下。
-
5
Linux下如何在命令行下解析处理json文件 2024-01-19 2 分钟阅读 最近调试Elasticsearch比较多,老用curl来查看数据,pretty=on固然是好,可是如果要具体看传回来的json数据,还是不方便,另外如果想在shell里处理json格式,就不...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK