Shell 的變數)

來源:互聯網
上載者:User
變數的取用: 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 $mynameVBird  <==出現了!因為這個變數已經被配置了!

變數的配置規則

  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 $nameVBird[root@www ~]# myname="$name its me"[root@www ~]# echo $mynameVBird 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 $sum100+300+50  <==咦!怎麼沒有幫我計算加總?因為這是文字型態的變數屬性啊![root@www ~]# declare -i sum=100+300+50[root@www ~]# echo $sum450         <==瞭乎??

由於在預設的情況底下, bash 對於變數有幾個基本的定義:

  • 變數類型預設為『字串』,所以若不指定變數類型,則 1+2 為一個『字串』而不是『計算式』。 所以上述第一個啟動並執行結果才會出現那個情況的;
  • bash 環境中的數值運算,預設最多僅能到達整數形態,所以 1/3 結果是 0;

現在你曉得為啥你需要進行變數宣告了吧?如果需要非字串類型的變數,那就得要進行變數的宣告才行啦! 底下繼續來玩些其他的 declare 功能。

範例二:將 sum 變成環境變數[root@www ~]# declare -x sum[root@www ~]# export | grep sumdeclare -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

 

轉自 http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_2.php

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.