bash shell變數的配置規則

來源:互聯網
上載者:User

bash shell變數的配置規則 變數與變數內容以一個等號『=』來連結,如下所示: 『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        <==子程式:離開這個子程式什麼是『子程式』呢?就是說,在我目前這個 shell 的情況下,去啟用另一個新的 shell ,新的那個 shell 就是子程式啦!在一般的狀態下,父程式的自訂變數是無法在子程式內使用的。但是透過 export 將變數變成環境變數後,就能夠在子程式底下應用了!很不賴吧!至於程式的相關概念, 我們會在第十七章程式管理當中提到的喔! 範例六:如何進入到您目前核心的模組目錄?[root@www ~]# cd /lib/modules/`uname -r`/kernel[root@www ~]# cd /lib/modules/$(uname -r)/kernel每個 Linux 都能夠擁有多個核心版本,且幾乎 distribution 的核心版本都不相同。以 CentOS 5.3 (未升級前) 為例,他的預設核心版本是 2.6.18-128.el5 ,所以核心模組目錄在 /lib/modules/2.6.18-128.el5/kernel/ 內。 也由於每個 distributions 的這個值都不相同,但是我們卻可以利用 uname -r 這個命令先取得版本資訊。所以囉,就可以透過上面命令當中的內含命令 `uname -r` 先取得版本輸出到 cd ... 那個命令當中,就能夠順利的進入目前核心的驅動程式所放置的目錄囉!很方便吧! 其實上面的命令可以說是作了兩次動作,亦即是: 先進行反單引號內的動作『uname -r』並得到核心版本為 2.6.18-128.el5將上述的結果帶入原命令,故得命令為:『cd /lib/modules/2.6.18-128.el5/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 將失去原有的變數內容,僅為一般字元的顯示型態而已!這裡必需要特別小心在意! 例題:在命令下達的過程中,反單引號( ` )這個符號代表的意義為何?答:在一串命令中,在 ` 之內的命令將會被先運行,而其運行出來的結果將做為外部的輸入資訊!例如 uname -r 會顯示出目前的核心版本,而我們的核心版本在 /lib/modules 裡面,因此,你可以先運行 uname -r 找出核心版本,然後再以『 cd 目錄』到該目錄下,當然也可以運行如同上面範例六的運行內容囉。  另外再舉個例子,我們也知道, locate 命令可以列出所有的相關檔案檔名,但是,如果我想要知道各個檔案的許可權呢?舉例來說,我想要知道每個 crontab 相關檔名的許可權:[root@www ~]# ls -l `locate crontab`如此一來,先以 locate 將檔案名稱資料都列出來,再以 ls 命令來處理的意思啦!瞭了嗎? ^_^ 例題:若你有一個常去的工作目錄名稱為:『/cluster/server/work/taiwan_2005/003/』,如何進行該目錄的簡化?答:在一般的情況下,如果你想要進入上述的目錄得要『cd /cluster/server/work/taiwan_2005/003/』, 以鳥哥自己的案例來說,鳥哥跑數值模式常常會配置很長的目錄名稱(避免忘記),但如此一來變換目錄就很麻煩。 此時,鳥哥習慣利用底下的方式來降低命令下達錯誤的問題:
 [root@www ~]# work="/cluster/server/work/taiwan_2005/003/"[root@www ~]# cd $work
 未來我想要使用其他目錄作為我的模式工作目錄時,只要變更 work 這個變數即可!而這個變數又可以在 bash 的設定檔中直接指定,那我每次登陸只要運行『 cd $work 』就能夠去到數值模式模擬的工作目錄了!是否很方便呢? ^_^ Tips:老實說,使用『 version=$(uname -r) 』來取代『 version=`uname -r` 』比較好,因為反單引號大家老是容易打錯或看錯! 所以現在鳥哥都習慣使用 $( 命令 ) 來介紹這個功能! 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.