變量類型,區別
位置變量$0 $1,$2,$# $@ $*
變量的類型:本地變量、環境變量、位置變量
本地變量:生效范圍為當前shell進程,對當前shell之外的其他shell進程包括當前shell的子進程均無效
環境變量:生效范圍為當前shell進程及子進程
位置變量:$1,…..$n,${10}來表示,用于放腳本在腳本代碼中調用通過命令行傳遞給它的參數
【本地變量】
變量賦值:name=‘value’,
可以使用引用value:
(1) 可以是直接字串; name=“root"
(2) 變量引用:name="$USER"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND)
變量引用:${name}, $name
"":弱引用,其中的變量引用會被替換為變量值
'':強引用,其中的變量引用不會被替換為變量值,而保持原字符串
顯示已定義的所有變量:set
刪除變量:unset name
生效范圍為當前shell進程,對當前shell之外的其他shell進程包括當前shell的子進程均無效
如下圖:
編輯一個本地變量:name=mage
echo $mage 可查詢變量
新開一個窗口再次查詢就不顯示了,這就是本地變量
這里我們寫一個小腳本驗證一下,
第一行是:shell程序開頭的環境指定,這里我們用的是bash
第二行是:一些描述信息;本地變量測試腳本
然后定義var1=success
最后這行是為了方便我們下一步測試,讓它把這個變量輸出到屏幕上
給它執行權限,然后用相對路徑運行,然后顯示出我們腳本里echo打印的信息;但是用echo $var1卻沒有。
So:本地變量只針對當前環境有效!
我們再建立一個var2的腳本,將var1的變量也寫進去
沒有顯示var1的變量。
So:本地變量只對當前環境有效
【環境變量】
生效范圍為當前shell進程及子進程
顯示所有環境變量:
export
env
printenv
?刪除:unset name
上面我們說過:本地變量只能在當前環境(shell)下使用,
環境變量就是在變量前聲明、賦值。加一個字符串:export
圖①
用之前聲明就行
還有一種寫法:declare –x 等價于export
練習題:
編寫腳本/root/bin/backup.sh,可實現將/etc/目錄備份到/root/下生成etcYYYY-mm-dd
中間的是正文,其他為描述信息
有了上下倆行輸出信息提示,我們再運行腳本的時候就明白這個腳本是否已經開始和結束了。
【位置變量】
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$1, $2, …:對應第1、第2等參數,shift [n]換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
上題,如備份,用起來不靈活,如果我想要備份別的目錄呢?或者備份到別的地方呢?
想要靈活就需要參數
新建f1腳本。 把f1的參數作為f2的參數 一個用$*一個用$@。 當我們執行f1.sh腳本的時,f2.sh腳本會調用f1.sh后跟的參數。簡單講就是上一個腳本參數的調用。
結果如下圖:
$1(引用第一個參數)打印出來的是全部
$2(引用第二個參數)打印出來的是空
因為$*調用的參數是一個整體(多個字符)
所以第一個參數就是“a b c d”第二個參數自然就沒有了
$@調用的參數是單個參數(字符)
當我們把$*和$@的雙引號去掉后就沒區別了
為被雙引號引用時,所有的參數被認為是各個獨立的單詞
第十個參數怎么寫?
${10}如果寫成$10,系統會認為是$1和0的組合
第十個參數是$10,然后結果是:a0
當加上大括號的時候就顯示正確了
原創文章,作者:cszdz123,如若轉載,請注明出處:http://www.www58058.com/33291
有理論有實踐,圖文并貌,可以算是不錯的筆記,但是,我們寫博客是為了給別人看的,可以講解變量是什么,有哪幾類,各類變量的應用場景等。