Shell變量

變量的取用: 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  <==出現了!因爲這個變量已經被配置了!

變量的配置守則

  1. 變量與變量內容以一個等號『=』來連結,如下所示: 
    『myname=VBird』
     
  2. 等號兩邊不能直接接空格符,如下所示爲錯誤: 
    『myname = VBird』或『myname=VBird Tsai』
     
  3. 變量名稱只能是英文字母與數字,但是開頭字符不能是數字,如下爲錯誤: 
    『2myname=VBird』
     
  4. 變量內容若有空格符可使用雙引號『"』或單引號『'』將變量內容結合起來,但
    • 雙引號內的特殊字符如 $ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』則『echo $var』可得『lang is en_US』
    • 單引號內的特殊字符則僅爲一般字符 (純文本),如下所示:
      『var='lang is $LANG'』則『echo $var』可得『lang is $LANG』
  5. 可用跳脫字符『 \ 』將特殊符號(如 [Enter], $, \, 空格符, '等)變成一般字符;
     
  6. 在一串命令中,還需要藉由其他的命令提供的信息,可以使用反單引號『`命令`』或 『$(命令)』。特別注意,那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號! 例如想要取得核心版本的配置:
    『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
     
  7. 若該變量爲擴增變量內容時,則可用 "$變量名稱" 或 ${變量} 累加內容,如下所示:
    『PATH="$PATH":/home/bin』
     
  8. 若該變量需要在其他子程序運行,則需要以 export 來使變量變成環境變量:
    『export PATH』
     
  9. 通常大寫字符爲系統默認變量,自行配置變量可以使用小寫字符,方便判斷 (純粹依照使用者興趣與嗜好) ;
     
  10. 取消變量的方法爲使用 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

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