變量的取用: echo
[root@www ~]# echo $variable [root@www ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@www ~]# echo ${PATH}
變量的配置
[root@www ~]# echo $myname <==這裏並沒有任何數據~因爲這個變量尚未被配置!是空的! [root@www ~]# myname=VBird [root@www ~]# echo $myname VBird <==出現了!因爲這個變量已經被配置了!
變量的配置守則
- 變量與變量內容以一個等號『=』來連結,如下所示:
『myname=VBird』
- 等號兩邊不能直接接空格符,如下所示爲錯誤:
『myname = VBird』或『myname=VBird Tsai』
- 變量名稱只能是英文字母與數字,但是開頭字符不能是數字,如下爲錯誤:
『2myname=VBird』
- 變量內容若有空格符可使用雙引號『"』或單引號『'』將變量內容結合起來,但
- 雙引號內的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』則『echo $var』可得『lang is en_US』 - 單引號內的特殊字符則僅爲一般字符 (純文本),如下所示:
『var='lang is $LANG'』則『echo $var』可得『lang is $LANG』
- 雙引號內的特殊字符如 $ 等,可以保有原本的特性,如下所示:
- 可用跳脫字符『 \ 』將特殊符號(如 [Enter], $, \, 空格符, '等)變成一般字符;
- 在一串命令中,還需要藉由其他的命令提供的信息,可以使用反單引號『`命令`』或 『$(命令)』。特別注意,那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號! 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
- 若該變量爲擴增變量內容時,則可用 "$變量名稱" 或 ${變量} 累加內容,如下所示:
『PATH="$PATH":/home/bin』
- 若該變量需要在其他子程序運行,則需要以 export 來使變量變成環境變量:
『export PATH』
- 通常大寫字符爲系統默認變量,自行配置變量可以使用小寫字符,方便判斷 (純粹依照使用者興趣與嗜好) ;
- 取消變量的方法爲使用 unset :『unset 變量名稱』例如取消 myname 的配置:
『unset myname』
底下讓鳥哥舉幾個例子來讓你試看看,就知道怎麼配置好你的變量囉!
範例一:配置一變量 name ,且內容爲 VBird
[root@www ~]# 12name=VBird
-bash: 12name=VBird: command not found <==屏幕會顯示錯誤!因爲不能以數字開頭!
[root@www ~]# name = VBird <==還是錯誤!因爲有空白!
[root@www ~]# name=VBird <==OK 的啦!
範例二:承上題,若變量內容爲 VBird's name 呢,就是變量內容含有特殊符號時:
[root@www ~]# name=VBird's name
# 單引號與雙引號必須要成對,在上面的配置中僅有一個單引號,因此當你按下 enter 後,
# 你還可以繼續輸入變量內容。這與我們所需要的功能不同,失敗啦!
# 記得,失敗後要復原請按下 [ctrl]-c 結束!
[root@www ~]# name="VBird's name" <==OK 的啦!
# 命令是由左邊向右找→,先遇到的引號先有用,因此如上所示,單引號會失效!
[root@www ~]# name='VBird's name' <==失敗的啦!
# 因爲前兩個單引號已成對,後面就多了一個不成對的單引號了!因此也就失敗了!
[root@www ~]# name=VBird\'s\ name <==OK 的啦!
# 利用反斜槓 (\) 跳脫特殊字符,例如單引號與空格鍵,這也是 OK 的啦!
範例三:我要在 PATH 這個變量當中『累加』:/home/dmtsai/bin 這個目錄
[root@www ~]# PATH=$PATH:/home/dmtsai/bin
[root@www ~]# PATH="$PATH":/home/dmtsai/bin
[root@www ~]# PATH=${PATH}:/home/dmtsai/bin
# 上面這三種格式在 PATH 裏頭的配置都是 OK 的!但是底下的例子就不見得囉!
範例四:承範例三,我要將 name 的內容多出 "yes" 呢?
[root@www ~]# name=$nameyes
# 知道了吧?如果沒有雙引號,那麼變量成了啥?name 的內容是 $nameyes 這個變量!
# 呵呵!我們可沒有配置過 nameyes 這個變量吶!所以,應該是底下這樣纔對!
[root@www ~]# name="$name"yes
[root@www ~]# name=${name}yes <==以此例較佳!
範例五:如何讓我剛剛配置的 name=VBird 可以用在下個 shell 的程序?
[root@www ~]# name=VBird
[root@www ~]# bash <==進入到所謂的子程序
[root@www ~]# echo $name <==子程序:再次的 echo 一下;
<==嘿嘿!並沒有剛剛配置的內容喔!
[root@www ~]# exit <==子程序:離開這個子程序
[root@www ~]# export name
[root@www ~]# bash <==進入到所謂的子程序
[root@www ~]# echo $name <==子程序:在此運行!
VBird <==看吧!出現配置值了!
[root@www ~]# exit <==子程序:離開這個子程序
在一般的狀態下,父程序的自定義變量是無法在子程序內使用的。但是透過 export 將變量變成環境變量後,就能夠在子程序底下應用了!
反單引號
如何進入到您目前核心的模塊目錄? [root@www ~]# cd /lib/modules/`uname -r`/kernel [root@www ~]# cd /lib/modules/$(uname -r)/kernel
取消變量
取消剛剛配置的 name 這個變量內容 [root@www ~]# unset name
單引號與雙引號
單引號與雙引號的最大不同在於雙引號仍然可以保有變量的內容,但單引號內僅能是一般字符 ,而不會有特殊符號。我們以底下的例子做說明:假設您定義了一個變量, name=VBird ,現在想以 name 這個變量的內容定義出 myname 顯示 VBird its me 這個內容,要如何訂定呢? [root@www ~]# name=VBird [root@www ~]# echo $name VBird [root@www ~]# myname="$name its me" [root@www ~]# echo $myname VBird its me [root@www ~]# myname='$name its me' [root@www ~]# echo $myname $name its me 發現了嗎?沒錯!使用了單引號的時候,那麼 $name 將失去原有的變量內容,僅爲一般字符的顯示型態而已!這裏必需要特別小心在意
變量的有效範圍
什麼?變量也有使用的『範圍』?沒錯啊~我們在上頭的 export 命令說明中,就提到了這個概念了。如果在跑程序的時候,有父程序與子程序的不同程序關係時, 則『變量』可否被引用與 export 有關。被 export 後的變量,我們可以稱他爲『環境變量』! 環境變量可以被子程序所引用,但是其他的自定義變量內容就不會存在於子程序中。
declare / typeset
declare 或 typeset 是一樣的功能,就是在『宣告變量的類型』。如果使用 declare 後面並沒有接任何參數,那麼 bash 就會主動的將所有的變量名稱與內容通通叫出來,就好像使用 set 一樣啦! 那麼 declare 還有什麼語法呢?看看先:
[root@www ~]# declare [-aixr] variable 選項與參數: -a :將後面名爲 variable 的變量定義成爲數組 (array) 類型 -i :將後面名爲 variable 的變量定義成爲整數數字 (integer) 類型 -x :用法與 export 一樣,就是將後面的 variable 變成環境變量; -r :將變量配置成爲 readonly 類型,該變量不可被更改內容,也不能 unset 範例一:讓變量 sum 進行 100+300+50 的加總結果 [root@www ~]# sum=100+300+50 [root@www ~]# echo $sum 100+300+50 <==咦!怎麼沒有幫我計算加總?因爲這是文字型態的變量屬性啊! [root@www ~]# declare -i sum=100+300+50 [root@www ~]# echo $sum 450 <==瞭乎??
由於在默認的情況底下, bash 對於變量有幾個基本的定義:
- 變量類型默認爲『字符串』,所以若不指定變量類型,則 1+2 爲一個『字符串』而不是『計算式』。 所以上述第一個運行的結果纔會出現那個情況的;
- bash 環境中的數值運算,默認最多僅能到達整數形態,所以 1/3 結果是 0;
現在你曉得爲啥你需要進行變量宣告了吧?如果需要非字符串類型的變量,那就得要進行變量的宣告才行啦! 底下繼續來玩些其他的 declare 功能。
範例二:將 sum 變成環境變量 [root@www ~]# declare -x sum [root@www ~]# export | grep sum declare -ix sum="450" <==果然出現了!包括有 i 與 x 的宣告! 範例三:讓 sum 變成只讀屬性,不可更動! [root@www ~]# declare -r sum [root@www ~]# sum=tesgting -bash: sum: readonly variable <==老天爺~不能改這個變量了! 範例四:讓 sum 變成非環境變量的自定義變量吧! [root@www ~]# declare +x sum <== 將 - 變成 + 可以進行『取消』動作 [root@www ~]# declare -p sum <== -p 可以單獨列出變量的類型 declare -ir sum="450" <== 看吧!只剩下 i, r 的類型,不具有 x 囉!
declare 也是個很有用的功能~尤其是當我們需要使用到底下的數組功能時, 他也可以幫我們宣告數組的屬性喔!不過,老話一句,數組也是在 shell script 比較常用的啦! 比較有趣的是,如果你不小心將變量配置爲『只讀』,通常得要註銷再登陸才能復原該變量的類型了!
數組 (array) 變量類型
某些時候,我們必須使用數組來宣告一些變量,這有什麼好處啊?在一般人的使用上, 果然是看不出來有什麼好處的!不過,如果您曾經寫過程序的話,那纔會比較瞭解數組的意義~ 數組對寫數值程序的設計師來說,可是不能錯過學習的重點之一哩!好!不囉唆~ 那麼要如何配置數組的變量與內容呢?在 bash 裏頭,數組的配置方式是:
var[index]=content
意思是說,我有一個數組名爲 var ,而這個數組的內容爲 var[1]=小明, var[2]=大明, var[3]=好明 .... 等等,那個 index 就是一些數字啦,重點是用中刮號 ([ ]) 來配置的。 目前我們 bash 提供的是一維數組。老實說,如果您不必寫一些複雜的程序, 那麼這個數組的地方,可以先略過,等到有需要再來學習即可!因爲要製作出數組, 通常與循環或者其他判斷式交互使用纔有比較高的存在意義!
範例:配置上面提到的 var[1] ~ var[3] 的變量。 [root@www ~]# var[1]="small min" [root@www ~]# var[2]="big min" [root@www ~]# var[3]="nice min" [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}" small min, big min, nice min
【轉自】https://www.cnblogs.com/ggjucheng/archive/2012/10/24/2737889.html