給sh 指令碼傳遞引數時,需要解析引數,命令後提供的所有的以空格分隔的內容對shell來說都是引數。傳入的引數有兩種型別 一種是開關引數:只有引數不需要指定引數值;另一種是含值引數:提供指定引數的值。當指定含值引數時,還需要緊隨其後指定乙個引數作為前面含值引數的值。
為了能被getopts識別,提交命令行時,引數名需要 以"-"標記。如果是含值引數則引數值緊隨其後以空格分隔且不需要"-"標記。
getopts 每次被呼叫都獲取乙個引數,並記錄下乙個引數的位置。為此有兩個內建的變數optind 和optarg。optind初始值為1,getopts呼叫讀取引數後,將optind 設定為下乙個待處理的引數的位置;optarg是當前引數的值,getopts 讀取引數時,如果發現引數時數值引數,如果緊鄰的下乙個引數是沒有"-"標識,則把該引數當做前乙個引數的值,如果緊鄰的這個引數有"-"標識,則將optarg置位空。 getopts分析引數時,數值引數後需要用":"標記,開關型別引數不需要。getopts處理數值引數時,會將緊鄰的無"-"標識的引數當做數值引數的值,因此在一次getopts呼叫中分析了兩個引數,因此optind的值會被加2.
echo '$*' $*
echo '$0='$0 '$1='$1 '$2='$2 '$3='$3 '$4='$4 '$5='$5 '$6='$6 '$7='$7 '$8='$8 '$9='$9 '$10='"$" '$11='"$" '$12='"$" '$13='"$" '$14='$ '$15='$
echo optind=$optind
while getopts "a:b:cdef:g" para
doecho optind=$optind
case $para in
a) echo "[a]optind=$optind optarg=$optarg"
echo "--------a-----------";;
b) echo "[b]optind=$optind optarg=$optarg"
echo "--------b-----------";;
c) echo "[c]optind=$optind optarg=$optarg"
echo "--------c-----------";;
d) echo "[d]optind=$optind optarg=$optarg"
echo "--------d-----------";;
e) echo "[e]optind=$optind optarg=$optarg"
echo "--------e-----------";;
f) echo "[f]optind=$optind optarg=$optarg"
echo "--------f-----------";;
g) echo "[g]optind=$optind optarg=$optarg"
echo "--------g-----------";;
esac
done
shift 1
echo $*
shift 1
echo $*
shift 1
echo $*
shift 1
echo $*
echo '$0='$0 '$1='$1 '$2='$2 '$3='$3 '$4='$4 '$5='$5 '$6='$6 '$7='$7 '$8='$8 '$9='$9 '$10='"$" '$11='"$" '$12='"$" '$13='"$" '$14='$ '$15='$
下面是指令碼測試輸出:
csp12au():/home/scnzqz $> ./test.sh -a aaa -b bbb -c -d -e -f fff -g
$* -a aaa -b bbb -c -d -e -f fff -g
$0=./test.sh $1=-a $2=aaa $3=-b $4=bbb $5=-c $6=-d $7=-e $8=-f $9=fff $10=-g $11= $12= $13= $14= $15=
optind=1
optind=3
[a]optind=3 optarg=aaa
--------a-----------
optind=5
[b]optind=5 optarg=bbb
--------b-----------
optind=6
[c]optind=6 optarg=
--------c-----------
optind=7
[d]optind=7 optarg=
--------d-----------
optind=8
[e]optind=8 optarg=
--------e-----------
optind=10
[f]optind=10 optarg=fff
--------f-----------
optind=11
[g]optind=11 optarg=
--------g-----------
aaa -b bbb -c -d -e -f fff -g
-b bbb -c -d -e -f fff -g
bbb -c -d -e -f fff -g
-c -d -e -f fff -g
$0=./test.sh $1=-c $2=-d $3=-e $4=-f $5=fff $6=-g $7= $8= $9= $10= $11= $12= $13= $14= $15=
Shell 指令碼除錯
除錯功能是每一門程式語言都應該實現的重要特性,每個系統程式設計師都應該了解bash的除錯選項 1.使用選項 x,啟動shell指令碼的跟蹤除錯功能,將執行的每一條命令和輸出的結果輸出 test.sh檔案 bin bash foriin do echo i done echo script execu...
除錯shell指令碼
遇見莫名其妙的錯誤,先dos2uinux指令碼。echo命令是最有用的除錯指令碼工具之一。一般在可能出現問題的指令碼前後加入echo命令 使用bash命令引數進行除錯 引數 n 不會執行該指令碼,僅查詢指令碼語法是否有問題,並給出錯誤提示。v 在執行指令碼時,先將指令碼的內容輸出到螢幕上然後執行指令...
shell 指令碼除錯
發表於 2016 4 27 0 03 30 1693 人閱讀 分類 shell 除錯功能是每一門程式語言都應該實現的重要特性,每個系統程式設計師都應該了解bash的除錯選項 1.使用選項 x,啟動shell指令碼的跟蹤除錯功能,將執行的每一條命令和輸出的結果輸出 test.sh檔案 bin bash...