在 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 指令碼。