将参数传递给程序是您使用的任何语言的常见操作之一。 同样,在本文中,我们将看到如何解析参数 bash 使用 getopts 的脚本 bash Linux中的内置函数。
介绍
我们在终端中运行的每个命令都有一个与之关联的参数。 为了 example,你可以把Linux中最基本的命令命名为 df 显示文件系统磁盘空间使用情况。 它接受参数/标志,如 -h
, -i
, --version
, ETC。
与此类似,当您根据用例创建 shell 脚本时,您可能必须根据传递的参数处理脚本。
有两种方法可以解析传递给脚本的参数 bash.
一种是编写逻辑以使用特殊变量手动解析参数 [email protected], $1, $2 … $N。 另一种方法是使用 获取选择.
Getopts 与 POSIX 兼容 bash 接受短参数的内置函数,例如 -h
, -v
, -b
等。您不能传递长参数,例如 --help
, --version
. 如果你想解析长选项,还有另一个实用程序叫做 获取选择 这是一个外部程序,而不是 bash 内置。
在使用标志/参数时,我可以想到三种可能的情况。
- 即使没有传递参数或标志也会运行的脚本。
- 接受标志但没有参数的脚本。
- 接受标志和标志的相关参数的脚本。
您将学习如何创建一个 bash 在接下来的部分中满足上述场景的脚本。
获得帮助
您可以运行以下帮助命令来访问 getopts 帮助部分。
$ getopts -help
Getopts 的核心结构
为了使用 getopts,您应该了解四个重要术语。
getopts: getopts optstring name [arg …]
OPTSTRING
– 被识别为参数的字符列表。 例子:-h
,-v
.OPTNAME
– 解析的参数来自[email protected]
将存储在OPTNAME
多变的。 您可以使用任何名称作为 optname。OPTARG
– 如果传递了其他参数,则将其存储在OPTARG
多变的。OPTIND
– 指向下一个要处理的参数的索引。
当您将参数传递给脚本时,它们将存储在变量中 [email protected] Getopts 将从中获取参数列表 [email protected] 采用 OPTIND
并解析它。
您应该在 OPTSTRING
. While 循环用于遍历传递的参数列表并使用 OPTIND
getopts 将获取参数并将其存储在 OPTNAME
.
这 案例陈述 用于检查模式是否与 OPTNAME
并运行其相应的语句。
我将在整篇文章中运行以下代码。 这是一个简单易懂的代码。 首先我创建了一个名为“帮助” 我的脚本有一个使用语法。
我在 OPTSTRING 中使用了三个参数; “-s
, -T
, -h
“. 变量命名 ARG
是个 OPTNAME
在下面的代码中使用。 解析后的参数将存储在 $ARG
并使用 case 语句,它将尝试查找模式是否与 ARG
多变的。
以下脚本将接受类似的标志 -s
, -h
, -T
你也可以组合像这样的标志 -shT
.
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T <arg>, -h" } while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing" ;; ?) echo "Something is wrong" ;; esac done shift "$((OPTIND-1))"
上述代码的功能将在接下来的部分中详细解释。
没有通过任何参数
getopts 的默认行为是,如果没有传递任何参数,它不会抛出错误消息并会以返回码退出 零.
在某些情况下,当未传递任何参数时,脚本不应运行。 在这种情况下,您可以使用条件语句来检查传递的参数的长度([email protected]
) 是否为零。 如果未传递任何参数,则脚本将失败。
看看下面的代码。 我将传递的参数存储到变量 PASSED_ARGS
并检查它的长度。 如果长度为 PASSED_ARGS
不为零,则 while loop
使用 getopts 将运行,否则 help
函数将运行,脚本将退出并返回代码 1.
[email protected] if [[ ${#PASSED_ARGS} -ne 0 ]] then while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing for $ARG" ;; ?) echo "Something is wrong" ;; esac done else help exit 1 fi shift "$((OPTIND-1))"
您还可以使用以下单行代码来评估传递的参数。
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in [email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }
带标志的参数及其支持的参数
您可以只传递标志,例如 -h
或者 -s
到脚本或标志和相关的参数,如 -T
给它。 你应该添加一个 冒号 (:) 在标志标识符 (-T
) 使标志接受参数。
在下面的代码中,您可以看到我添加了冒号 (:
) 在标识符之后 T
. 这意味着当我通过 -T
标记脚本,我应该传递一个额外的参数。
while getopts ":sT:h" ARG; do
当参数传递给标志时,它将存储在变量中 $OPTARG
. 您必须编写逻辑来捕获变量并相应地处理它。 复制并运行上一节中的相同代码。
T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;;

您还可以一次组合并运行多个参数。

处理错误
可能存在错误传递参数并且脚本应该抛出一些错误的情况。
默认情况下,当传递的标志不在时,getopts 会抛出错误消息 OPTSTRING
或者如果您未能将其他参数传递给标志。 添加一个 冒号 到开始 OPTSTRING
将抑制默认错误消息。
让我们删除冒号并再次运行脚本。 我正在路过 -x
作为第一个参数,它不存在于 OPTSTRING
. 第二, -T
需要一个我未能提供的附加参数在这两种情况下,它都会向我抛出错误。

现在,您可以隐藏默认错误消息并打印您自己的错误消息。 从 case 语句中查看以下模式。
- 冒号 (:) -> 如果没有传递额外的参数
OPTARG
将设置为冒号,您可以编写逻辑来打印错误消息。 - ? -> 当一个参数不在
OPTSTRING
已通过,OPTNAME
将设置为“?
”。
:) echo "argument missing" ;; ?) echo "Something is wrong" ;;

Shift 和 OPTIND 的使用
如果您使用使用 getopts 编写的任何现有脚本,您将在之后看到此语句 while
环形。
shift "$((OPTIND-1))"
当脚本被触发时, OPTIND
设定为 1. 这 OPTIND
指向 getopts 处理的下一个参数的位置。
上面的语句将删除所有由 getopts 解析的选项和 $1
不会设置为传递给脚本的第一个非可选参数。
结论
在本文中,我们看到了如何解析参数 bash 使用 getopts 函数的脚本。 Getopts 仅支持短形式的参数,您不能传递长参数。
起初,使用 getopts 似乎很棘手。 但是,如果您了解核心概念,那就很容易了。
类似阅读:
- 如何在 Linux 的 Bash 脚本中解析 CSV 文件
Bash 脚本指南:
- 如何在 Linux 和 Unix 中使用 Zenity 在 Bash 脚本中创建 GUI 对话框
- Bash 脚本 – 案例陈述
- Bash 脚本 – 条件语句
- Bash 脚本 – 字符串操作
- Bash 脚本 – Printf 命令用示例解释
- Bash 脚本——用示例解释索引数组
- Bash 脚本——用示例解释的关联数组
- Bash 脚本——用例子解释 For 循环
- Bash 脚本 – While 和 until 循环用示例解释
- 用示例解释 Bash 重定向
- Bash 脚本——用例子解释的变量
- Bash 脚本——用例子解释的函数
- 用 Linux 中的示例解释 Bash Echo 命令
- Bash Heredoc 初学者教程