在 Linux 的 Bash 中解析命令行参数


摘要

命令行参数可以按顺序输入,也可以由 bash 程序处理成选项。这些参数被命令行实用程序用来在执行环境之间进行选择性选择,或者有条件地触发 Bash 脚本中的函数。它们可以在 Bash 中以各种方式设置。

注意 - Linux 命令区分大小写。

getopt 语法

getopts 的语法如下:

$ getopts optstring opt [arg ...]

以下适用于上述函数:

  • 选项由 optstring 表示。如果选项后面跟着一个冒号 (:),则它期望一个响应。例如,如果选项 c 期望一个参数,则在 optstring 中将其表示为 c:。

  • 当选项具有相应的参数时,getopts 会将参数的字符串值存储在 OPTARG shell 变量中。例如,OPTARG 变量将保存传递给选项 c 的参数。

我们将在接下来的部分中看到这些概念的实际应用,它们将变得清晰。

使用 getopt 解析复杂参数

当参数数量增加或变量的赋值受条件限制时。在这种情况下,必须有一个强大的结构。这个问题由命令行工具 getopt 解决,它提供语法和选项来定义和解析参数。

这是一个关于使用 getopt 定义参数的快速指南。

向命令行实用程序提供参数时,有两种类型。它们包括:

  • 短参数:使用连字符和一个字符来定义这些参数。例如,-h 表示帮助,-l 表示列表命令。

  • 长参数:这些是完整的字符串,前面有两个连字符。例如,--help 和 --list 分别表示帮助和列表。

考虑这个脚本 tutorials_options.sh,其中使用 getopt 实用程序设置参数:

#!/bin/bash

SHORT=p:,q:,r
LONG=tutorial1:, tutorial2:, help
OPTS=$(getopt --alternative --name class --options $SHORT --longoptions $LONG -- "$@") 

getopt 实用程序的 --options 标志接收短参数,而 --longoptions 标志接收长参数。我们在上面的代码中具有三个简写选项:

  • P 代表教程 1

  • Q 代表教程 2

  • R 代表帮助

考虑 tutorials_test.sh 脚本使用的 shift 命令来记录和报告我们参数中选项的值:

#!/bin/bash

SHORT=p:,:,r
LONG=tutorial1:,tutorial2:,help
OPTS=$(getopt -a -n class --options $SHORT --longoptions $LONG -- "$@")

eval set -- "$OPTS"

while :
do
  case "$1" in
    -p | --tutorial1 )
      tutorial1="$2"
      shift 2
      ;;
    -q | --tutorial2 )
      tutorial2="$2"
      shift 2
      ;;
    -r | --help)
      "This is a class script"
      exit 2
      ;;
    --)
      shift;
      break
      ;;
    *)
      echo "Unexpected option: $1"
      ;;
  esac
done

echo $tutorial1, $tutorial2
) 

当脚本使用正确的参数调用时,将打印两个分配的变量,如下所示:

$ bash tutorials_test.sh --tutorial1 class1 --tutorial2  class2
class1, class2 

请注意,当脚本遇到双连字符 (--) 时,它如何终止。

结论

本文讨论了从 shell 脚本传递位置参数和解析复杂可选参数的基本知识。

这些现实世界的例子可以用来增强我们日常生活中使用的 shell 脚本。

更新于: 2023年3月23日

3K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始
广告