Bash 脚本——使用 getopts 解析 Bash 脚本中的参数

将参数传递给程序是您使用的任何语言的常见操作之一。 同样,在本文中,我们将看到如何解析参数 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 …]
  1. OPTSTRING – 被识别为参数的字符列表。 例子: -h, -v.
  2. OPTNAME – 解析的参数来自 [email protected] 将存储在 OPTNAME 多变的。 您可以使用任何名称作为 optname。
  3. OPTARG – 如果传递了其他参数,则将其存储在 OPTARG 多变的。
  4. OPTIND – 指向下一个要处理的参数的索引。

当您将参数传递给脚本时,它们将存储在变量中 [email protected] Getopts 将从中获取参数列表 [email protected] 采用 OPTIND 并解析它。

您应该在 OPTSTRING. While 循环用于遍历传递的参数列表并使用 OPTINDgetopts 将获取参数并将其存储在 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 初学者教程