特殊變數($0、$1、$2、 $?、 $# 、$@、 $*)
阿新 • • 發佈:2021-11-23
特殊變數($0、$1、$2、 $?、 $# 、$@、 $*)
特殊變數($0、$1、$2、 $?、 $# 、$@、 $*)
shell程式設計中有一些特殊的變數可以使用。這些變數在指令碼中可以作為全域性變數來使用。
名稱 | 說明 |
$0 | 指令碼名稱 |
$1-9 | 指令碼執行時的引數1到引數9 |
$? | 指令碼的返回值 |
$# | 指令碼執行時,輸入的引數的個數 |
$@ | 輸入的引數的具體內容(將輸入的引數作為一個多個物件,即是所有引數的一個列表) |
$* | 輸入的引數的具體內容(將輸入的引數作為一個單詞) |
$@與$*的區別:
$@與$*都可以使用一個變數來來表示所有的引數內容,但這兩個變數之間有一些不同之處。
$@:將輸入的引數作為一個列表物件
$*:將輸入的引數作為一個單詞
原始碼:
1 echo "指令碼的名字是:"$0 2 n=1 3 echo "使用\$@的引數列表為:"$@ 4 for temstr in "$@" 5 do 6 echo "第$n個引數是:" $temstr 7 let n+=1 8 done 9 10 11 n=1 12 echo "使用\$*的引數列表為:"$* 13 for temstr in "$*" 14 do 15 echo "第$n個引數是:" $temstr 16 let n+=1 17 done
執行結果:
1 $ ./test.sh 1 2 3 4 2 指令碼的名字是:./test.sh 3 使用$@的引數列表為:1 2 3 4 4 第1個引數是: 1 5 第2個引數是: 2 6 第3個引數是: 3 7 第4個引數是: 4 8 使用$*的引數列表為:1 2 3 4 9 第1個引數是: 1 2 3 4
在上面的例子中,使用$@與$*是,都是用雙引號引起來,但當$*不使用雙引號時,結果與$@的結果相同。
原因分析:
當都使用雙引號時,我們可以看到引數列表輸出都是一樣的,說明確實兩個變數都可以儲存所有的引數內容,也就顯示出來兩個變數之間的對引數處理的不同,即一個將其作為列表處理,一個講所有引數作為一個單詞處理。
當$*不適用雙引號時,執行到for語句時,會首先將$*的值(1 2 3 4 )取出來,然後迴圈語句就變成了 for tem in 1 2 3 4,最後的輸出結果也就變成了列表的迴圈輸出。
1 原始碼: 2 #!/bin/bash 3 n=1 4 for tem in $* 5 do 6 echo $n is $tem 7 let n+=1 8 done 9
執行結果:
# ./test.sh 1 2 3 4 1 is 1 2 is 2 3 is 3 4 is 4
在這裡補充一下單引號、雙引號以及沒有引號的區別:
單引號:
可以說是所見即所得:即將單引號內的內容原樣輸出,或者描述為單引號裡面看見的是什麼就會輸出什麼。
雙引號:
把雙引號內的內容輸出出來;如果內容中有命令,變數等,會先把變數,命令解析出結果,然後在輸出最終內容來。
雙引號內命令或變數的寫法為`命令或變數`或$(命令或變數)。
無引號:
把內容輸出出來,可能不會講含有空格的字串視為一個整體輸出;
如果內容中有命令、變數等,會先把變數、命令解析結果,然後在輸出最終內容來;
如果字串中帶有空格等特殊字元,則不能完整的輸出,需要改加雙引號,一般連續的字串,數字,路徑等可以用,不過最好用雙引號替代之