我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$n。n 代表乙個數字,1 為執行指令碼的第乙個引數,2 為執行指令碼的第二個引數,以此類推……
例項以下例項我們向指令碼傳遞三個引數,並分別輸出,其中 $0 為執行的檔名:
#!/bin/bash
echo "shell 傳遞引數例項!";
echo "執行的檔名:$0";
echo "第乙個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";
為指令碼設定可執行許可權,並執行指令碼,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
執行的檔名:./test.sh
第乙個引數為:1
第二個引數為:2
第三個引數為:3
另外,還有幾個特殊字元用來處理引數:
引數處理 說明
$# 傳遞到指令碼的引數個數
$* 以乙個單字串顯示所有向指令碼傳遞的引數。
如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有引數。
$$ 指令碼執行的當前程序id號
$! 後台執行的最後乙個程序的id號
$@ 與$*相同,但是使用時加引號,並在引號中返回每個引數。
如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有引數。
$- 顯示shell使用的當前選項,與set命令功能相同。
$? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。
#!/bin/bash
echo "shell 傳遞引數例項!";
echo "第乙個引數為:$1";
echo "引數個數為:$#";
echo "傳遞的引數作為乙個字串顯示:$*";
執行指令碼,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
第乙個引數為:1
引數個數為:3
傳遞的引數作為乙個字串顯示:1 2 3
$* 與 $@ 區別:
相同點:都是引用所有引數。
不同點:只有在雙引號中體現出來。假設在指令碼執行時寫了三個引數 1、2、3,,則 " * " 等價於 「1 2 3」(傳遞了乙個引數),而 「@」 等價於 「1」 「2」 「3」(傳遞了三個引數)。
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
執行指令碼,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---12
3
getopts是乙個解析指令碼選項引數的工具。
語法格式:getopts [option[:]] [descprition] variable
option:表示為某個指令碼可以使用的選項.
「:」:如果某個選項(option)後面出現了冒號(」:」),則表示這個選項後面可以接引數(即一段描述資訊descprition)
variable:表示將某個選項儲存在變數variable中
getopts是linux系統中的乙個內建變數,一般用在迴圈中。每當執行迴圈是,getopts都會檢查下乙個命令選項,如果這些選項出現在option中,則表示是合法選項,否則不是合法選項。並將這些合法選項儲存在variable這個變數中。
getopts還包含兩個內建變數,及optarg和optind
初次使用要注意這幾點:
1)指令碼位置引數會與optstring中的單個字母逐個匹配,如果匹配到就賦值給name,否則賦值name為問號;
2)optstring中單個字母是乙個選項,如果字母後面加冒號,表示該選項後面帶引數,引數值並會賦值給optarg變數;
3)optstring中第乙個是冒號,表示遮蔽系統錯誤(test.sh: illegal option — h);
4)允許把選項放一起,例如-ab
1、getops引數簡單使用
詳解shell指令碼中關於getopts的使用方法
執行結果:
./getopts1.sh -d 'nice' fixnale
當輸入-d時,opt
=d,opt=d,
opt=d,
optarg=』nice』,因此就會顯示d)…這一部分的資訊。
由於這裡有乙個選項(-d)和乙個引數(『nice』),$optind指向命令列中下乙個選項或引數的索引位置,因此這裡即為3。
shift [
[[optind-1]表示將檔名前面的選項和引數踢掉.
詳解shell指令碼中關於getopts的使用方法
執行結果:
說明:while getopts 「:a:bc:」 opt
#第乙個冒號表示忽略錯誤;字元後面的冒號表示該選項必須有自己的引數。
$optarg
儲存相應選項的引數,如上例中的11、6;
$optind
總是儲存原始$*中下乙個要處理的選項(不是引數,而是選項,此處指的是a,b,c這三個選項,而不是那些數字,當然數字也是會占有位置的)位置。
optind
初值為1,遇到」x」,選項不帶引數,optind+=1;遇到」x:」,帶引數的選項,optarg=ar**[optind+1],optind+=2;遇到」x::」,可選引數,屬於#1和#2之一。
第一行輸出echo $*
C 給函式傳遞引數的兩種方式
呼叫函式的時候,我們需要傳遞給函式引數。有兩種方式,一種是pass by value,另一種方式是pass by reference。二者是有區別的。所謂的pass by value 傳值 就是將變數拷貝乙份,效果是如果在函式內部對這個變數修改了,那麼這種修改並不會反映到函式外部。呼叫函式執行完畢後...
陣列的兩種傳遞方式
陣列傳遞 將陣列作為引數傳遞給函式,分值傳遞和位址傳遞。其中,值傳遞的效率較低,不建議使用。兩種傳遞方式都會改變main函式中陣列的值,如下 中a 3 的結果都為6。注意區分陣列的值傳遞和函式值傳遞的區別。陣列的兩種傳遞方式 includeusing namespace std 值傳遞 void f...
值傳遞和引用傳遞 函式引數傳遞的兩種方式
在定義函式時函式括號中的變數名成為形式引數,簡稱形參或虛擬引數 在主調函式中呼叫乙個函式時,該函式括號中的引數名稱為實際引數,簡稱實參,實參可以是常量 變數或表示式。1 c語言中實參和形參之間的額資料傳遞是單向的 值傳遞 單向傳遞,只能由實參傳給形參,反之不能。2 被呼叫函式的形參只有函式被呼叫時才...