shell變量

 導言 css

有人會問,變量有什麼好說的。頂多賦值一下,引用一下咯。其實否則,活用變量,用好變量,能夠在編程中節省不少沒必要要的代碼,並且,關於變量,諸如變量展開,變量判斷等,也是shell編程重要的基本功之一。


SHELL變量
變量(variable)是計算機內存中可存儲值的一塊空間,變量名就是這塊空間的名字,變量必定有一個值,這個值就寫在這塊內存空間內。
shell是一種弱類型的編程語言,不強制要求聲明變量類型,事實上,shell變量類型可看作是字串string或者整數int(其實也沒區別)。


變量聲明和賦值
賦值的時候注意,=符號兩旁沒有任何空格。
  1. $ var=some_value                      #默認完成變量的聲明和賦值
  2. ----------------------------------------
  3. $ var="some important value"         #須要引號圈引帶有空格的字串
  4. ----------------------------------------
  5. $ var1=a var2=b var3=$var1               #同一行完成多變量賦值
  6. $ eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` #經典案例:同時把MONTH DATE HOUR變量賦值完畢
  7. $ echo $MONTH $DATE $HOUR
  8. 201212 20121208 12


變量的引用
變量名var表明變量自己,$var表明變量值,${var}等價。
特別注意有時候,必須使用${var_name}的形式,否則會有歧義。
  1. $ var=abc
  2. $ echo $var #方法1,輸出abc
  3. $ echo ${var} #方法2,等效
  4. $ echo "${var}" #方法3,等效
  5. --------------------------------------
  6. echo $varvar #輸出空,找不到varvar變量
  7. echo ${var}var #輸出abcvar,注意
  8. --------------------------------------
  9. var_another=$var #完成值引用


關於未定義變量和空變量
shell裏面,容許變量爲空。空值指變量"不含任何字符",等價於,"變量長度爲0"。空值記爲null。
當引用一個從未出現的變量時,shell判斷爲未定義。直到下次賦值前,變量值默認被設爲null,即空值。
  1. a=b=2 d=3
  1. $ echo "$a$b$c$d" #c未定義就被引用,此時c值是空
  2. 123
unset(built-in)
unset能夠刪除變量,重置變量爲「未定義」的狀態。
For each name, remove the corresponding variable or function
  1. $ m=has_a_name #m賦值
  2. $ unset m #取消m
  3. $ echo $m #null
不多有場景會嚴格區分"變量未定義"和"已定義但爲空"的狀況,通常狀況下,使用二者並沒有區別。
但某些狀況下,未定義的變量可能會形成必定隱患,好比rm -rf /$DIR,且DIR未定義。

set(built-in)
若是想避免使用未定義變量的話,請在腳本開頭加上set -u,即「不使用未定義的變量」。
  1. set -u
  2. x=""             #x是空值,已定義
  3. y=            #y是空值,已定義
  4. echo $x$y$z        #z是未定義,此時z值爲空(null)
  5. -bash: z: unbound variable #不容許使用z
  6. -------------------------------------------
  7. unset y
  8. echo $x$y
  9. --bash: y: unbound variable #unset是刪除,而非清空。
附:順便說一句,shell未嚴格區分未定義和空值的狀況,但在其餘腳本語言好比perl中,嚴格把未定義變量當作undef數據類型,空值就是""。


其餘
先寫些基本的,而後深刻談論變量替換等深刻內容。


技巧
  1. eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` eval和賦值的經典案例:同時把MONTH DATE HOUR變量賦值完畢;
  2. unset用來刪除變量,而非清空變量;
  3. set -u 設置後能夠防止使用未定義的變量。
相關文章
相關標籤/搜索