導言 css
有人會問,變量有什麼好說的。頂多賦值一下,引用一下咯。其實否則,活用變量,用好變量,能夠在編程中節省不少沒必要要的代碼,並且,關於變量,諸如變量展開,變量判斷等,也是shell編程重要的基本功之一。
SHELL變量
變量(variable)是計算機內存中可存儲值的一塊空間,變量名就是這塊空間的名字,變量必定有一個值,這個值就寫在這塊內存空間內。
shell是一種弱類型的編程語言,不強制要求聲明變量類型,事實上,shell變量類型可看作是字串string或者整數int(其實也沒區別)。
變量聲明和賦值
賦值的時候注意,=符號兩旁沒有任何空格。
- $ var=some_value #默認完成變量的聲明和賦值
- ----------------------------------------
- $ var="some important value" #須要引號圈引帶有空格的字串
- ----------------------------------------
- $ var1=a var2=b var3=$var1 #同一行完成多變量賦值
- $ eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` #經典案例:同時把MONTH DATE HOUR變量賦值完畢
- $ echo $MONTH $DATE $HOUR
- 201212 20121208 12
變量的引用
變量名var表明變量自己,$var表明變量值,${var}等價。
特別注意有時候,必須使用${var_name}的形式,否則會有歧義。
- $ var=abc
- $ echo $var #方法1,輸出abc
- $ echo ${var} #方法2,等效
- $ echo "${var}" #方法3,等效
- --------------------------------------
- echo $varvar #輸出空,找不到varvar變量
- echo ${var}var #輸出abcvar,注意
- --------------------------------------
- var_another=$var #完成值引用
關於未定義變量和空變量
shell裏面,容許變量爲空。空值指變量"不含任何字符",等價於,"變量長度爲0"。空值記爲null。
當引用一個從未出現的變量時,shell判斷爲未定義。直到下次賦值前,變量值默認被設爲null,即空值。
- $ a=1 b=2 d=3
- $ echo "$a$b$c$d" #c未定義就被引用,此時c值是空
- 123
unset(built-in)
用unset能夠刪除變量,重置變量爲「未定義」的狀態。
For each name, remove the corresponding variable or function
- $ m=has_a_name #m賦值
- $ unset m #取消m
- $ echo $m #null
不多有場景會嚴格區分"變量未定義"和"已定義但爲空"的狀況,通常狀況下,使用二者並沒有區別。
但某些狀況下,未定義的變量可能會形成必定隱患,好比rm -rf /$DIR,且DIR未定義。
set(built-in)
若是想避免使用未定義變量的話,請在腳本開頭加上set -u,即「不使用未定義的變量」。
- set -u
- x="" #x是空值,已定義
- y= #y是空值,已定義
- echo $x$y$z #z是未定義,此時z值爲空(null)。
- -bash: z: unbound variable #不容許使用z
- -------------------------------------------
- unset y
- echo $x$y
- --bash: y: unbound variable #unset是刪除,而非清空。
附:順便說一句,shell未嚴格區分未定義和空值的狀況,但在其餘腳本語言好比perl中,嚴格把未定義變量當作undef數據類型,空值就是""。
其餘
先寫些基本的,而後深刻談論變量替換等深刻內容。
技巧
- eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` ,eval和賦值的經典案例:同時把MONTH DATE HOUR變量賦值完畢;
- unset用來刪除變量,而非清空變量;
- set -u 設置後能夠防止使用未定義的變量。