在 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+ 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告