Bash中變量的討論

變量不管是在哪種開發語言中,都佔有着舉足輕重的位置,可以使我們的腳本更加靈活,也能提高其遷移性。對於變量的設置規範有了通透的瞭解之後,既能避免不必要的錯誤,也能保證腳本撰寫的效率。因爲往往一些莫名其妙的報錯,都是由於不規範的變量設置引起的,左查右查,最終查出是由於書寫不規範引起的,往往會氣的發笑。
說了那麼多,我就歸結一些關於變量的知識


一、變量的設置
(1)變量的一般賦值
變量的一般賦值較爲簡單,就是運用“=”來進行,但是應注意的是,等號兩側不應添加空格

[root@localhost ~]# bianliang=123
[root@localhost ~]# echo $bianliang
123
[root@localhost ~]# echo ${bianliang}
123

由上,變量的輸出應該在變量名前加“$”,具體的寫法也分兩種,在這裏推薦使用第二種寫法,因爲其在後期變量輸出值修改時有規範變量名的效果

[root@localhost ~]# echo 1$bianliang1
1123
[root@localhost ~]# echo 1${bianliang}
1123
[root@localhost ~]# echo $bianliang1

[root@localhost ~]# echo ${bianliang}1
1231

可以看到,在變量前加入輸出是,並不會有影響,但當在變量之後加輸出值是,可能會導致變量名的混淆,識別爲未聲明變量,導致輸出異常
(2)變量的運算
變量運算式的寫法如下

[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# let a+b
[root@localhost ~]# let c=a+b
[root@localhost ~]# echo $c
3
[root@localhost ~]# echo $[a+b]
3

這裏看到,兩種的寫法都能正確的給出結果,但同樣的,個人更傾向於寫法二,更簡單清晰,這也因人而異。但是要注意的是,不能直接對剛賦值的變量進行算術運算,應爲變量默認的設置類型爲字符型,而並非整數型,那麼直接計算的結果必然是錯誤的,當然,我們可以使用特殊的命令來轉換其類型,那就是declare/typeset,這兩個命令是等價的

[root@localhost ~]# a=1;b=2;c=a+b;
[root@localhost ~]# echo $c
a+b
[root@localhost ~]# typeset -i a;typeset -i b;typeset -i c;
[root@localhost ~]# a=1;b=2;c=a+b;
[root@localhost ~]# echo $c
3

我們運用typeset命令“-i”的選項把變量類型轉變爲整數型,就可以正確的進行運算了,當然還有其他的一些選項。

  1. -i :定義成爲整數數字類型
  2. -x :定義爲環境變量;
  3. -r :將變量設置成爲只讀類型
  4. -a :將變量定義成爲陣列類型

這裏也是簡單的說一下不能直接運算的原因,關於更深入的變量類型暫時先不展開討論。我們平時運用$[ ]就可以解決這類問題,不必去麻煩轉化類型。
(3)變量的命令式
變量的命令式賦值可以將命令的運行結果直接複製給變量

[root@localhost ~]# a=$`hostname`
[root@localhost ~]# echo $a
$localhost.localdomain
[root@localhost ~]# b=$(hostname)
[root@localhost ~]# echo $b
localhost.localdomain

可以看到兩種方法得到變量的結果都是一樣的。


二、變量的修改
變量值的修改我們通過簡答的賦值覆蓋來完成,但是我們這裏要說明的不是此種方法,而是具有判斷效益的賦值修改,也就是根據變量的當前值判斷是否進行復制修改,大致分爲四種操作“-”“+”“=”“?”
(1)“-”/“:-”

[root@localhost ~]# a2="";a3=" ";a4=1;
[root@localhost ~]# a1=${a1-5};a2=${a2-5};a3=${a3-5};a4=${a4-5};
[root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4}
5:: :1

由上的實驗,我們先解釋一下,a1、a2、a3、a4分別代表了變量的四種不同狀態,即未定義、空值、含空白符、有當前值四種狀態,用“-”分別對四種狀態進行賦值覆蓋實驗,並觀察結果。得出的結論爲“-”操作只對爲設定的變量進行值覆蓋,包括空值在內的狀態都不予影響,可謂是十分紳士^_^。“-”還有一種拓展用法,便是“:-”,那麼我們再進行實驗看看有何不同。

[root@localhost ~]# a2="";a3=" ";a4=1;
[root@localhost ~]# a1=${a1:-5};a2=${a2:-5};a3=${a3:-5};a4=${a4:-5};
[root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4}
5:5: :1

有結果可以觀察到,“:-”操作的覆蓋狀態延伸到了空值的身上,把未定義和空值狀態的變量都進行了值覆蓋,要注意區別兩種操作。

(2)“+”/“:+”
下面我們對“+”/“:+”兩個操作的執行效果進行實驗

[root@localhost ~]# a2="";a3=" ";a4=1;
[root@localhost ~]# a1=${a1+5};a2=${a2+5};a3=${a3+5};a4=${a4+5};
[root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4}
:5:5:5

可以觀察到,“+”操作將不對未定義的變量進行影響,而將以存在的變量進行了覆蓋。

[root@localhost ~]# a2="";a3=" ";a4=1;
[root@localhost ~]# a1=${a1:+5};a2=${a2:+5};a3=${a3:+5};a4=${a4:+5};
[root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4}
::5:5

這次的實驗是對“:-”進行實驗,可以看到,該操作對未定義和空值變量不給予影響,而是將含空值和現有值的變量覆蓋修改

操作 未定義 空值 空白符 有值
- 覆蓋
:- 覆蓋 覆蓋
+ 覆蓋 覆蓋 覆蓋
:+ 覆蓋 覆蓋

暫時先對以上兩種操作進行了分析,有興趣的同學可以在對剩下的兩種操作分別進行實驗觀察結果,雖然這幾種操作對實際操作沒有過多的幫助,但是確是十分有趣的。


三、變量的刪除
刪除變量的方法是運用unset命令

[root@localhost ~]# unset a

但是要注意的是,這裏的unset不能移除已經被定義爲只讀類型的變量,只得通過重啓來重置變量。

以上便是對變量的淺層次認識,熟練的變量操作重要性不必再多敘,也希望各位能打實自己的基礎,那樣在後期的腳本編寫中才能更順暢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章