Linux中國

如何在 Bash shell 腳本中解析命令行選項

終端命令通常具有 選項或開關,用戶可以使用它們來修改命令的執行方式。關於命令行界面的 POSIX 規範 中就對選項做出了規範,這也是最早的 UNIX 應用程序建立的一個由來已久的慣例,因此你在創建自己的命令時,最好知道如何將選項包含進 Bash 腳本 中。

與大多數語言一樣,有若干種方法可以解決 Bash 中解析選項的問題。但直到今天,我最喜歡的方法仍然是我從 Patrick Volkerding 的 Slackware 構建腳本中學到的方法,當我第一次發現 Linux 並敢於冒險探索操作系統所附帶的純文本文件時,這些腳本就是我的 shell 腳本的引路人。

Bash 中的選項解析

在 Bash 中解析選項的策略是循環遍歷所有傳遞給 shell 腳本的參數,確定它們是否是一個選項,然後轉向下一個參數。重複這個過程,直到沒有選項為止。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

在這段代碼中,我創建了一個 while 循環,它會一直進行循環操作,直到處理完所有參數。if 語句會試著將在第一個位置($1)中找到的參數與 --alpha-a 匹配。(此處的待匹配項是任意選項名稱,並沒有特殊意義。在實際的腳本中,你可以使用 --verbose-v 來觸發詳細輸出)。

shift 關鍵字會使所有參數位移一位,這樣位置 2($2)的參數移動到位置 1($1)。處理完所有參數後會觸發 else 語句,進而中斷 while 循環。

在腳本的末尾,$ALPHA 的值會輸出到終端。

測試一下這個腳本:

$ bash ./test.sh --alpha
1
$ bash ./test.sh

$ bash ./test.sh -a
1

可以看到,選項被正確地檢測到了。

在 Bash 中檢測參數

但上面的腳本還有一個問題:多餘的參數被忽略了。

$ bash ./test.sh --alpha foo
1
$

要想捕獲非選項名的參數,可以將剩餘的參數轉儲到 Bash 數組 中。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

ARG=( "${@}" )
for i in ${ARG[@]}; do
    echo $i
done

測試一下新版的腳本:

$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo

foo
$ bash ./test.sh --alpha foo bar
1
foo
bar

帶參選項

有一些選項需要傳入參數。比如,你可能希望允許用戶設置諸如顏色或圖形解析度之類的屬性,或者將應用程序指向自定義配置文件。

要在 Bash 中實現這一點,你仍然可以像使用布爾開關一樣使用 shift 關鍵字,但參數需要位移兩位而不是一位。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
    CONFIG=$2
    shift 2
else
    break
fi
done

echo $ALPHA
echo $CONFIG

ARG=( "${@}" )

for i in ${ARG[@]}; do
    echo $i
done

在這段代碼中,我添加了一個 elif 子句來將每個參數與 --config-c 進行比較。如果匹配,名為 CONFIG 的變數的值就設置為下一個參數的值(這就表示 --config 選項需要一個參數)。所有參數都位移兩位:其中一位是跳過 --config-c,另一位是跳過其參數。與上節一樣,循環重複直到沒有匹配的參數。

下面是新版腳本的測試:

$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz

Bash 讓選項解析變得簡單

還有一些其他方法也可以解析 Bash 中的選項。你可以替換使用 case 語句或 getopt 命令。無論使用什麼方法,給你的用戶提供選項都是應用程序的重要功能,而 Bash 讓解析選項成為了一件簡單的事。

via: https://opensource.com/article/21/8/option-parsing-bash

作者:Seth Kenlon 選題:lujun9972 譯者:unigeorge 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國