學習目標
位置引數
內部引數
如同ls命令可以接受目錄等作為它的引數一樣,在Shell程式設計時同樣可以使用引數。Shell程式中的引數分為位置引數和內部引數等。
12-3-1 位置引數
由系統提供的引數稱為位置引數。位置引數的值可以用$N得到,N是一個數字,如果為1,即$1。類似C語言中的陣列,Linux會把輸入的命令字串分段並給每段進行標號,標號從0開始。第0號為程式名字,從1開始就表示傳遞給程式的引數。如$0表示程式的名字,$1表示傳遞給程式的第一個引數,以此類推。
12-3-2 內部引數
上述過程中的$0是一個內部變數,它是必須的,而$1則可有可無,最常用的內部變數有$0、$#、$?、$*,它們的含義如下。
$0: 含命令所在的路徑。
$#: 傳遞給程式的總的引數數目。
$?: Shell程式在Shell中退出的情況,正常退出返回0,反之為非0值。
$*: 傳遞給程式的所有引數組成的字串。
例項:編寫一個Shell程式,用於描述Shell程式中的位置引數為:$0、$#、$?、$*,程式名為test1,程式碼如下:
root@ubuntu:~$ vi test1 #! /bin/sh echo "Program name is $0"; echo "There are totally $# parameters passed to this program"; echo "The last is $?"; echo "The parameter are $*"; root@ubuntu:~$ ./test1 this is a test program //傳遞5個引數 執行後的結果如下: Program name is ./test1 //給出程式的完整路徑和名字 There are totally 5 parameters passed to this program //引數的總數 The last is 0 //程式執行效果 The parameter are this is a test program //返回由引數組成的字串
注意:命令不計算在引數內。
例項:利用內部變數和位置引數編寫一個名為test2的簡單刪除程式,如刪除的檔名為a,則在終端中輸入的命令為:test a。
分析:除命令外至少還有一個位置引數,即$#不能為0,刪除不能為$1,程式設計過程如下。
1)、用vi編輯程式 root@ubuntu:~$ #vi test2 #! /bin/sh if test $# -eq 0 then echo "Please specify a file!" else gzip $1 //現對檔案進行壓縮 mv $1.gz $HOME/dustbin //移動到回收站 echo "File $1 is deleted !" fi 2)、設定許可權 root@ubuntu:~$ chmod +x test2 3)、執行 root@ubuntu:~$ ./test2 Please specify(指定) a file! root@ubuntu:~$ ./test2 a gzip: a: No such file or directory mv: cannot stat `a.gz': No such file or directory File a is deleted ! root@ubuntu:~$ touch a root@ubuntu:~$ ./test2 a (如果a檔案在當前目錄下存在) File a is deleted !