Shell 指令碼除錯經驗 2

2021-09-27 08:49:21 字數 2731 閱讀 8496

給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...