Bash中變數的討論

2021-08-05 19:21:52 字數 3602 閱讀 3363

變數不管是在哪種開發語言中,都占有著舉足輕重的位置,可以使我們的指令碼更加靈活,也能提高其遷移性。對於變數的設定規範有了通透的了解之後,既能避免不必要的錯誤,也能保證指令碼撰寫的效率。因為往往一些莫名其妙的報錯,都是由於不規範的變數設定引起的,左查右查,最終查出是由於書寫不規範引起的,往往會氣的發笑。

說了那麼多,我就歸結一些關於變數的知識

一、變數的設定

(1)變數的一般賦值

變數的一般賦值較為簡單,就是運用「=」來進行,但是應注意的是,等號兩側不應新增空格

[root@localhost ~]# bianliang=123

[root@localhost ~]# echo $bianliang

123[root@localhost ~]# echo $

123

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

[root@localhost ~]# echo 1$bianliang1

1123

[root@localhost ~]# echo 1$

1123

[root@localhost ~]# echo $bianliang1

[root@localhost ~]# echo $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」的選項把變數型別轉變為整數型,就可以正確的進行運算了,當然還有其他的一些選項。

-i :定義成為整數數字型別

-x :定義為環境變數;

-r :將變數設定成為唯讀型別

-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=$;a2=$;a3=$;a4=$;

[root@localhost ~]# echo $:$:$:$

5:: :1

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

[root@localhost ~]# a2="";a3=" ";a4=1;

[root@localhost ~]# a1=$;a2=$;a3=$;a4=$;

[root@localhost ~]# echo $:$:$:$

5:5: :1

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

(2)「+」/「:+」

下面我們對「+」/「:+」兩個操作的執行效果進行實驗

[root@localhost ~]# a2="";a3=" ";a4=1;

[root@localhost ~]# a1=$;a2=$;a3=$;a4=$;

[root@localhost ~]# echo $:$:$:$

:5:5:5

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

[root@localhost ~]# a2="";a3=" ";a4=1;

[root@localhost ~]# a1=$;a2=$;a3=$;a4=$;

[root@localhost ~]# echo $:$:$:$

::5:5

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

操作未定義

空值空白符有值-

覆蓋不不不

:-覆蓋覆蓋不

不+不覆蓋

覆蓋覆蓋:+不

不覆蓋覆蓋

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

三、變數的刪除

刪除變數的方法是運用unset命令

[root@localhost ~]# unset a
但是要注意的是,這裡的unset不能移除已經被定義為唯讀型別的變數,只得通過重啟來重置變數。

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

bash中的變數

bash變數型別 環境變數 本地變數 區域性變數 位置變數 特殊變數 內建 本地變數 varname value 作用域為整個bash程序可以使用 變數命名規範 1.只能含字母 數字和下劃線,並且以字母和下劃線開頭 2.最好不要跟系統已有的環境變數重名 3.見名知意 區域性變數 local varn...

bash中變數的巧用

鳥哥的私房菜 可以用乙個變數來代替長串的目錄,這樣即好記,也提高了效率。引用如下 若你有乙個常去的工作目錄名稱為 cluster server work taiwan 2005 003 如何 進行該目錄的簡化?答 在一般的情況下,如果你想要進入上述該目錄得要 cd cluster server wo...

BASH中變數轉換

1.變數替換 bash shell可以進行變數的條件替換,既只有某種條件發生時才進行替換,替換 條件放在 中.1 當變數未定義或者值為空時,返回值為word的內容,否則返回變數的值.2 與前者類似,只是若變數未定義或者值為空時,在返回word的值的同時將 word賦值給value 3 若變數以賦值的...