終端命令通常包含一些參數,在使用的時候可以提供不同的參數來確定命令的執行方式。POSIX規范中包含了用于命令行接口的選項。這也是與最早的UNIX應用程序建立的一個由來已久的約定,所以當你在寫bash腳本的時候,需要知道如何在腳本中接受參數。
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關鍵字使所有參數移位1,這樣位置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關鍵字,但將參數移位2而不是1。
#!/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選項需要一個參數)。所有參數移位2:1移位--config或-c,1移位其參數。與往常一樣,循環會重復,直到沒有匹配的參數。
下面是對新版本腳本的測試:
$ 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中還有其他解析選項的方法。您可以交替使用case語句或getopt命令。無論您選擇使用什么,用戶的選項都是任何應用程序的重要特性,Bash使其變得簡單。
-
參數
+關注
關注
11文章
1829瀏覽量
32195 -
腳本
+關注
關注
1文章
389瀏覽量
14858 -
Bash
+關注
關注
0文章
57瀏覽量
10179
發布評論請先 登錄
相關推薦
評論