在 Bash 中解析命令列引數

Fumbani Banda 2023年1月30日
  1. 在 Bash 中解析位置引數
  2. 在 Bash 中使用標誌解析​​引數
  3. 在 Bash 中使用迴圈結構解析引數
  4. 在 Bash 中使用 shift 解析引數
在 Bash 中解析命令列引數

本教程演示了使用標誌、迴圈構造和移位運算子將命令列引數解析為 bash 指令碼作為位置引數。

在 Bash 中解析位置引數

位置引數按照它們傳遞給 bash 指令碼的順序進行訪問。第一個引數由 $1 訪問,第二個引數由 $2 訪問,依此類推。

echo "I am $1";
echo  "And I live in $2";

使用兩個位置引數執行指令碼:

bash positional_args.sh John USA

輸出:

I am John
And I live in USA

在 Bash 中使用標誌解析​​引數

標誌以每個引數前的連字元 - 開頭。使用標誌時,引數的順序無關緊要。

在下面的指令碼中,getopts 從輸入中讀取標誌,OPTARG 將其與相應的值匹配。

while getopts n:c: flag

do
    case "${flag}" in
          n) name=${OPTARG};;
          c) country=${OPTARG}
     esac
done
echo "I am $name";
echo  "And I live in $country";

跑:

bash flags.sh -n fumbani  -c Malawi

輸出:

I am fumbani
And I live in Malawi

在 Bash 中使用迴圈結構解析引數

當引數大小事先未知時,迴圈結構很有用。$@ 是一個包含所有輸入引數的變數。for 迴圈遍歷所有引數並處理傳遞的每個引數。

i=1
for arg in "$@"
do
    printf "argument $i: $arg\n"
    i=$((i + 1 ))
done

跑:

bash arguments_loop.sh USA Europe Africa Asia

輸出:

argument 1: USA
argument 2: Europe
argument 3: Africa
argument 4: Asia

在 Bash 中使用 shift 解析引數

shift 運算子使引數的索引從移位的位置開始。在我們的例子中,我們將引數移動 1 直到到達結尾。$# 指的是輸入大小,而 $1 每次都指的是下一個引數。

i=1
max=$#
while (( $i <= $max ))
do
    printf "Argument $i: $1\n"
    i=$((i + 1 ))
    shift 1
done

跑:

bash shift.sh one two three

輸出:

Argument 1: one
Argument 2: two
Argument 3: three
作者: Fumbani Banda
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub