要了解位置變量,首先要知道什麼是變量?
變量就是讓某一個特定的字符串來代表不固定的內容,簡單理解就是用一個簡單的“字眼”來替代另一個比較複雜或者容易變動的數據。
而什麼又是位置變量呢?
位置變量就是bash將傳遞給腳本的參數,按照位置不同,保存在不同的位置變量中,以便於腳本調用這些變量。
位置參數變量:
$1, $2, ...: | 對應第1、第2等參數,shift [n]換位置 |
$0: | 命令本身 |
$*: | 傳遞給腳本的所有參數,全部參數合爲一個字符串;代表“$1$2$3...” |
$@: | 傳遞給腳本的所有參數,每個參數爲獨立字符串;代表“"$1" "$2" "$3" ...” |
$#: | 傳遞給腳本的參數的個數 |
注:$@ ,$* 只在被雙引號包起來的時候纔會有差異
示例:
編寫一個腳本來測試一下上述的位置參數變量:
這個示例,可以看到位置參數變量,在bash中就實現定義好的,按照位置分配不同的變量。在執行腳本的時候,後面直接跟參數,就會賦予不同的變量,這樣在腳本中就可以直接調用。通過示例可以證明,
$N(N表示不同的數字),及可表明第N個參數變量;$0表示命令本身。
注:第十個以上的位置參數變量要使用“{ }”括起來,如:${10}
示例:比較$10和${10}的區別
可以看到"$10"表示($1)0;"${10}"才表示第十個位置參數變量.
示例:比較"$*"和"$@"的區別
可以看到:“touch "$*"”創建了一個名爲“aa bb”的文件
而“mkdir "$@"”創建了aa和bb兩個目錄。
所以,"$*"和"$@"雖然都是表示全部的參數,但是"$*"是把所有的參數當成爲一個整體,而"$@"則是把每個參數獨立看待。
需要注意的是,$*和$@只在被雙引號包起來的時候纔會有差異。讓我們來看下沒有加雙引號的情況:
如圖所示,使用“touch $*”是創建了cc和dd兩個文件,而“mkdir $@”因此存在同名文件而沒有創建成功,但是通過執行過程也可以看到,它是要創建cc和dd兩個目錄。所以以後使用"$*"或"$@"時,一定要加上雙引號。
還有一個位置參數變量爲$#,這個變量表示傳遞給腳本的參數的個數,讓我們來看看如何使用這個變量。
可以看到$#表示位置參數的個數,並且可以利用"$#"來判斷是否存在位置參數。