shell傳遞引數的兩種方式(詳解版)

2021-10-01 15:18:58 字數 4172 閱讀 8551

我們可以在執行 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 被呼叫函式的形參只有函式被呼叫時才...