shell編程學習筆記之特殊變量($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

 

  在這里補充一下單引號、雙引號以及沒有引號的區別

單引號:

  可以說是所見即所得:即將單引號內的內容原樣輸出,或者描述為單引號里面看見的是什么就會輸出什么。

 

雙引號:

  把雙引號內的內容輸出出來;如果內容中有命令,變量等,會先把變量,命令解析出結果,然后在輸出最終內容來。

  雙引號內命令或變量的寫法為`命令或變量`或$(命令或變量)。

 

無引號:

  把內容輸出出來,可能不會講含有空格的字符串視為一個整體輸出;

  如果內容中有命令、變量等,會先把變量、命令解析結果,然后在輸出最終內容來;

  如果字符串中帶有空格等特殊字符,則不能完整的輸出,需要改加雙引號,一般連續的字符串,數字,路徑等可以用,不過最好用雙引號替代之

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM