Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485908
  • 博文数量: 78
  • 博客积分: 1771
  • 博客等级: 上尉
  • 技术积分: 944
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-25 10:20
文章分类

全部博文(78)

文章存档

2014年(2)

2013年(10)

2012年(9)

2011年(7)

2010年(11)

2009年(10)

2008年(12)

2007年(17)

我的朋友

分类:

2007-04-27 17:54:32

Bash shell 的功能
既然 /bin/bash 是 Linux 預設的 shell ,那麼總是得瞭解一下這個玩意兒吧! BASH 是怎麼一回事呢?這個 shell 是 GNU 計畫中重要的工具軟體之一,目前也是 GNU 作業系統中標準的 shell ,他主要相容於 sh ,並且依據一些使用者需求,而加強的 shell 版本,可以說目前幾乎所有的 Linux distribution 都是使用 bash 作為管理核心的主要 shell !因此,不論您使用的是那個 distribution ,你都難逃需要學習 bash 的宿命啦!那麼這個 shell 有什麼好處,幹嘛 Linux 要使用他作為預設的 shell 呢? BASH 主要的優點有底下幾個:

命令編修能力(類似 DOS 的 doskey 功能):
使用 bash 裡頭,個人認為相當棒的一個功能就是『他能記憶使用過的指令!』 這功能真的相當的棒!因為我只要在指令列按『上下鍵』就可以找到前一個輸入的指令!而在很多 distribution 裡頭,預設的指令記憶功能可以到達 1000 個!也就是說, 你曾經下達過的指令都被記錄下來了,記錄的檔案在你的家目錄內的 .bash_history !不過,需要留意的是, ~/.bash_history 記錄的是前一次登入以前所執行過的指令, 而至於這一次登入所執行的指令都被暫存在暫記憶體中,當您成功的登出系統後,該指令記憶才會記錄到 .bash_history 當中!
這有什麼功能呢?最大的好處就是可以『查詢曾經做過的舉動!』, 如此可以知道你的執行步驟,那麼就可以追蹤您曾下達的指令,以作為除錯的工具! 但如此一來也有個煩惱,就是如果被駭客入侵了,那麼他只要翻你曾經執行過的指令, 剛好你的指令又跟系統有關(例如直接輸入 MySQL 的密碼在指令列上面)那麼很容易就被破解你的 Linux 主機!所以,最好是將記錄的指令數目減小一點較好!

命令與檔案補全功能:
還記得我們在 首次進入 Linux 的熱門按鍵 一節當中提到的 [tab] 這個按鍵嗎?!這個按鍵的功能就是在 bash 裡頭才有的啦!常常在 bash 環境中使用 [tab] 是個很棒的習慣喔!因為至少可以讓你 1)少打很多字; 2)確定輸入的資料是正確的! 使用 [tab] 按鍵的時機依據 [tab] 接在指令後或參數後而有所不同。我們再複習一次:
[Tab] 接在一串指令的第一個字的後面,則為命令補全;
[Tab] 接在一串指令的第二個字以後時,則為『檔案補齊』!
所以說,如果我想要知道我的環境中,所有可以執行的指令有幾個? 就直接在 bash 的提示字元後面輸入兩個 [tab][tab] 就能夠輸出所有的可執行指令了。 那如果想要知道系統當中所有以 c 為開頭的指令呢?就按下 c[tab][tab] 就好啦! ^_^
是的!真的是很方便的功能,所以,有事沒事,在 bash shell 底下,多按幾次 [tab] 是一個不錯的習慣啦!

命令別名(alias)設定功能:
假如我需要知道這個目錄底下的所有檔案(包含隱藏檔)及所有的檔案屬性,那麼我就必須要下達 ls -al 這樣的指令列,唉!真麻煩,有沒有更快的取代方式?呵呵!就使用命令別名呀!例如我最喜歡直接以 lm 這個自訂的命令來取代上面的命令,也就是說, lm 會等於 ls -al 這樣的一個功能,嘿!那麼要如何作呢?就使用 alias 即可!你可以在指令列輸入 alias 就可以知道目前的命令別名有哪些了!也可以直接下達命令來設定別名呦:
alias lm='ls -al'
工作控制(jobs)、前景背景控制:
這部分我們在之後的資源管理章節中會再提及! 使用前、背景的控制可以讓工作進行的更為順利!至於工作控制(jobs)的用途則更廣, 可以讓我們隨時將工作丟到背景中執行!而不怕不小心使用了 [Ctrl] + c 來停掉該程序!真是好樣的!此外,也可以在單一登入的環境中,達到多工的目的呢!

Shell scripts 的強大功能:
在 DOS 年代還記得將一堆指令寫在一起的所謂的『批次檔』吧?在 Linux 底下的 shell scripts 則發揮的更為強大的功能,可以將您日常生活當中常需要下達的連續指令寫成一個檔案, 該檔案並且可以透過對談互動式的方式來進行主機的偵測工作!也可以藉由 shell 提供的環境變數及相關指令來進行設計,哇!整個設計下來幾乎就是一個小型的程式語言了!該 scripts 的功能真的是超乎我的想像之外!以前在 DOS 底下需要程式語言才能寫的東西,在 Linux 底下使用簡單的 shell scripts 就可以幫你達成了!真的厲害!!這部分我們在後續章節再來談!

萬用字元!
除了完整的字串之外, bash 還支援許多的萬用字元來幫助使用者查詢與指令下達。 舉例來說,想要知道 /usr/X11R6/bin 底下有多少以 xt 為開頭的檔案嗎?使用: ls -l /usr/X11R6/bin/xt* 就能夠知道囉~此外,還有其他可供利用的萬用字元, 這些都能夠加快使用者的操作呢!
--------------------------------------------------------------------------------
Bash shell 的內建命令: type
我們在首次進入 Linux 章節當中,提到關於 Linux 的線上說明文件 部分,也就是 man page 的內容,那麼 bash 有沒有什麼說明文件啊?開玩笑~ 這麼棒的東西怎麼可能沒有說明文件!請您在 shell 的環境下,直接輸入 man bash 瞧一瞧, 嘿嘿!不是蓋的吧!讓您看個幾天幾夜也無法看完的 bash 說明文件,可是很詳盡的資料啊! ^_^
不過,在這個 man bash 所出現的 man page 當中,不知道您是否有察覺到,咦! 怎麼這個說明文件裡面有其他的檔案說明啊?舉例來說,那個 cd 指令的說明就在這個 man page 內? 然後我直接輸入 man cd 時,怎麼出現的畫面中,最上方竟然出現一堆指令的介紹??這是怎麼回事? 為了方便 shell 的操作,其實 bash 已經『內建』了很多指令了,例如上面提到的 cd , 還有例如 umask 等等的指令,都是內建在 bash 當中的呢!
那我怎麼知道這個指令是來自於外部指令(指的是其他非 bash 套件所提供的指令) 或是內建在 bash 當中的呢? 嘿嘿!利用 type 這個指令來觀察即可!舉例來說:
[root@linux ~]# type [-tpa] name
參數:
    :不加任何參數時,則 type 會顯示出那個 name 是外部指令還是 bash 內建的指令!
-t  :當加入 -t 參數時,type 會將 name 以底下這些字眼顯示出他的意義:
      file    :表示為外部指令;
      alias   :表示該指令為命令別名所設定的名稱;
      builtin :表示該指令為 bash 內建的指令功能;
-p  :如果後面接的 name 為指令時,會顯示完整檔名(外部指令)或顯示為內建指令;
-a  :會將由 PATH 變數定義的路徑中,將所有含有 name 的指令都列出來,包含 alias
範例:
範例一:查詢一下 ls 這個指令是否為 bash 內建?
[root@linux ~]# type ls
ls is aliased to `ls --color=tty'
# 沒有加上任何參數,僅列出 ls 這個指令的最主要使用情況
[root@linux ~]# type -t ls
alias
# -t 參數則僅列出 ls 這個指令的最主要使用情況說明
[root@linux ~]# type -a ls
ls is aliased to `ls --color=tty'
ls is /bin/ls
# 利用所有方法找出來的 ls 相關資訊都會被列出來!
範例二:那麼 cd 呢?
[root@linux ~]# type cd
cd is a shell builtin

透過 type 這個指令的用途,我們可以知道每個指令是否為 bash 的內建指令。 此外,由於利用 type 搜尋後面的名稱時,如果後面接的名稱並不能以執行檔的狀態被找到, 那麼該名稱是不會被顯示出來的。舉例來說,您的 FC4 應該不會有 vbird 這個指令吧?! 輸入 type -p vbird 看一下,果然沒有輸出任何資料!而如果您輸入的是 type -p touch 呢? 則會出現 /bin/touch !呵呵!所以,這個 type 也可以用來作為類似 which 指令的用途啦!找指令用的!
 
--------------------------------------------------------------------------------
指令的下達
我們在 首次進入 Linux 一節當中,已經提到過在 shell 環境下的指令下達方式,不過,因為這個部分實在很重要,所以,我們還是再次的提醒一次!
[root@linux ~]# command [-options] parameter1 parameter2 ...
                  指令     選項      參數(1)    參數(2)
說明:
0. 一行指令中第一個輸入的絕對是『指令(command)』或『可執行檔案』
1. command 為指令的名稱,例如變換路徑的指令為 cd 等等;
2. 中刮號[]並不存在於實際的指令中,而加入參數設定時,通常為 - 號,例如 -h;
   有時候完整參數名稱會輸入 -- 符號,例如 --help;
3. parameter1 parameter2.. 為依附在 option 後面的參數,
   或者是 command 的參數;
4. command, -options, parameter1.. 這幾個咚咚中間以空格來區分,
   不論空幾格 shell 都視為一格;
5. 按下 [Enter] 按鍵後,該指令就立即執行。[Enter] 按鍵為 字符,
   他代表著一行指令的開始啟動。
6. 指令太長的時候,可以使用 \ 符號來跳脫 [Enter] 符號,
   使指令連續到下一行。注意! \ 後就立刻接特殊字符。
7. 在 Linux 系統中,英文大小寫字母是不一樣的。舉例來說, cd 與 CD 並不同。
範例:
範例一:列出 /root 底下的各檔案名稱
[root@linux ~]# ls -al /root
[root@linux ~]# ls     -al      /root
# 不論指令與參數中間空幾格,都是可以接受的!
範例二:如果指令太長的話,如何使用兩行來輸出?
[root@linux ~]# cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root
# 上面這個指令,就是將三個檔案複製到 /root 這個目錄下而已。不過,因為指令太長,
# 於是鳥哥就利用 \[Enter] 來將 [Enter] 這個按鍵『跳脫!』開來,讓
# [Enter] 按鍵不再具有上述說明的第 5 點功能!好讓指令繼續在下一行輸入。
# 需要特別留意, [Enter] 按鍵是緊接著反斜線 (\) 的,兩者中間沒有其他字元。
# 因為 \ 僅跳脫『緊接著的下一個字符』而已!所以,萬一我寫成:
# \ [Enter] ,亦即 [Enter] 與反斜線中間有一個空格時,則 \ 跳脫的是『空白鍵』
# 而不是 [Enter] 按鍵!這個地方請在仔細的看一遍!很重要!
# 如果順利跳脫 [Enter] 後,下一行最前面就會主動出現 > 的符號,
# 您可以繼續輸入指令囉!也就是說,那個 > 是系統自動出現的,你不需要輸入。

總之,當我們順利的在終端機 (tty) 上面登入後, Linux 就會依據 /etc/passwd 檔案的設定給我們一個 shell ,預設就是 bash ,然後我們就可以依據上面的指令下達方式來操作 shell, 之後,我們就可以透過 man 這個線上查詢來查詢指令的使用方式與參數說明, 很不錯吧!那麼我們就趕緊更進一步來操作 bash 這個好玩的東西囉!
--------------------------------------------------------------------------------
Shell 的變數功能
在繼續研究 BASH 之前,我們得要先就 變數 這個東西來討論一番。 為什麼要討論變數呢?又,變數是啥玩意兒啊?!先來談一談國中數學好了,您是否依稀記得, 我們國中時候學過所謂的『 y = ax + b 』這東西?其中, y 是變數, x 則是這個變數的內容啊! 講的更簡單一點,我們可以『用一個簡單的 "字眼" 來取代另一個比較複雜或者是容易變動的資料』。這有什麼好處啊?最大的好處就是『方便!』。
如果以 Linux 主機的運作來說明好了,因為在主機裡面有太多的資料需要進行存取了, 而這些資料都是一些服務所必須的,例如某個名為 dmtsai 的帳號,他的 mail 的存取路徑預設是在 /var/spool/mail/dmtsai 、家目錄預設在 /home/dmtsai 等等。那如果換了另外一個帳號呢? 假設另一個帳號名稱為 vbird ,你猜他的郵件與家目錄在哪?應該是在 /var/spool/mail/vbird 與 /home/vbird 對吧! 那麼我們主機的郵件服務是否要記錄好幾個不同的路徑啊?會不會太麻煩?這當然很麻煩囉~ 所以為了簡化整個運作流程,我們就可以透過某個變數功能,讓這個變數可以依據不同的使用者而變更內容, 如此一來,系統的郵件服務只要依據那個變數去取得所需要的資料即可,就不需要記錄不同的路徑囉。
舉例來說,我們每個帳號的郵件信箱預設是以 MAIL 這個變數來進行存取的, 當 dmtsai 這個使用者登入時,他便會取得 MAIL 這個變數,而這個變數的內容其實就是 /var/spool/mail/dmtsai, 那如果 vbird 登入呢?他取得的 MAIL 這個變數的內容其實就是 /var/spool/mail/vbird 。 而我們使用信件讀取指令 mail 來讀取自己的郵件信箱時,嘿嘿,這支程式可以直接讀取 MAIL 這個變數的內容, 就能夠自動的分辨出屬於自己的信箱信件囉!這樣一來,設計程式的設計師就真的很方便的啦!
當然我們可以改變這些個變數,但是如果該變數是直接深植於套件當中, 那麼當你修改了某些參數之後,嘿嘿!你的套件就必須要『由原始碼直接更新再編譯』 才行!這樣似乎很麻煩,所以囉,變數真的是很方便的啦!
Tips:
舉個簡單的例子來說, sendmail 的 smtp 存放 mail 路徑是經由 /etc/profile 裡頭的:
MAIL="/var/spool/mail/$USER"
來設定的,而當我修改了上面這一個咚咚,然後重新開機之後,嘿嘿嘿嘿! 我的郵件就可以存放到不同的路徑去了!而且不會有問題!可以順利的『在 Linux 主機上面』收發。然而問題發生在 pop3 這個服務上面,由於 pop3 的預設路徑是在 source code 裡頭,而且就正是 /var/spool/mail 這個路徑,也就是說,不論我怎麼修正我的『變數』, pop3 都不為所動!唉~真慘,所以就無法直接以 pop3 來收信了(例如 OutLook 就不能工作了)!會發生密碼不接受的問題呢!  
再來繼續講到其他的變數功能好了,我們前面已經提到過很多次,能不能執行某個指令, 與 PATH 這個變數也有很大的關係的。舉例來說,我們在任何地方下達 ls 這個指令時,系統就是透過 PATH 這個變數裡面的內容所記錄的路徑順序來搜尋指令的呢!如果在搜尋完 PATH 變數內的路徑還找不到 ls 這個指令時, 就會在螢幕上顯示『 command not found 』的錯誤訊息了。
這些還都只是系統預設的變數的目的,如果是個人的設定方面的應用呢:例如你要寫一個大型的 script (批次檔)時,有些資料因為可能由於使用者習慣的不同而有差異,比如說路徑好了,由於該路徑在 script 被使用在相當多的地方,如果下次換了一部主機,都要修改 script 裡面的所有路徑,那麼我一定會瘋掉! 這個時候如果使用變數,而將該變數的定義寫在最前面,後面相關的路徑名稱都以變數來取代, 嘿嘿!那麼你只要修改一行就等於修改整篇 script 了!方便的很!所以,良好的程式設計師都會善用變數的定義! ( 這個部分我們在後續的 shell script 再次提及的!)
如果說的學理一點,那麼由於在 Linux System 下面,所有的執行續都是需要一個執行碼, 而就如同上面提到的,你『真正以 shell 來跟 Linux 溝通,是在正確的登入 Linux 之後!』這個時候你就有一個 bash 的執行程序,也才可以真正的經由 bash 來跟系統溝通囉!而在進入 shell 之前,也正如同上面提到的,由於系統需要一些變數來提供他資料的存取(或者是一些環境的設定參數值, 例如是否要顯示彩色等等的),所以就有一些所謂的『環境變數』 需要來讀入系統中了!這些環境變數例如 PATH、HOME、MAIL、SHELL 等等,都是很重要的, 為了區別與自訂變數的不同,環境變數通常以大寫字元來表示呢!
好了,那麼我們就簡單的來對『什麼是變數』作個簡單的定義好了: 『變數就是以一組文字或符號等,來取代一些設定或者是一串保留的資料!』, 例如:我設定了『myname』就是『VBird』,所以當你讀取 myname 這個變數的時候,系統自然就會知道!哈!那就是 VBird 啦!最簡單的例子可以取 PATH 來說明!如果你對於『相對路徑與絕對路徑』還有點印象的話, 那麼應該曉得『要下達正確的指令,應該需要指定路徑與檔名』才行!例如你的 ls 指令應該需要以『/bin/ls』來下達指令才對,那麼為何你在任意的路徑下都可以執行 ls 呢?而不需要指定路徑呢?這是因為系統已經預設了一些『搜尋路徑(PATH)』了, 所以當你需要執行一些指令的時候,系統就會依照該 PATH 的設定來進行指令的搜尋!而這個 PATH 就是所謂的變數了!
那麼如何『顯示變數』呢?這就需要使用到 echo 這個指令啦!

--------------------------------------------------------------------------------
變數的取用與設定:echo, 變數設定規則, unset
說的口沫橫飛的,也不知道『變數』與『變數代表的內容』有啥關係? 當然啦,那我們就將『變數』的『內容』拿出來給您瞧瞧就好了。利用 echo 這個指令來取用變數, 但是,變數在被取用時,前面必須要加上 $ 才行,舉例來說,要知道 PATH 的內容,該如何是好?
[root@linux ~]# echo $variable
[root@linux ~]# echo $PATH
/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
[root@linux ~]# echo ${PATH}

變數的取用就如同上面的範例,利用 ehco 就能夠讀出,只是需要在變數名稱前面加上 $ , 或者是以 ${variable} 的方式來取用都可以!當然啦,那個 echo 的功能可是很多的, 我們這裡單純是拿 echo 來讀出變數的內容而已,更多的 echo 使用,請自行給他 man echo 吧! ^_^
例題一:請在螢幕上面顯示出您的環境變數 HOME 與 MAIL:
答:
echo $HOME
echo $MAIL
OK!現在我們知道了變數與變數內的之間的相關性了,好了,那麼我要如何『設定』或者是『修改』 某個變數的內容啊?!很簡單啦!用『等號(=)』連接變數與他的內容就好啦!舉例來說: 我要將 myname 這個變數名稱的內容設定為 VBird ,那麼:
[root@linux ~]# echo $myname
   <==這裡並沒有任何資料~因為這個變數尚未被設定!是空的!
[root@linux ~]# myname=VBird
[root@linux ~]# echo $myname
VBird  <==出現了!因為這個變數已經被設定了!

瞧!如此一來,這個變數名稱 myname 的內容就帶有 VBird 這個資料囉~ 而由上面的例子當中,我們也可以知道: 當一個變數名稱尚未被設定時,預設的內容是『空』的。 另外,變數在設定時,還是需要符合某些規定的,否則會設定失敗喔! 這些規則如下所示啊!
變數與變數內容以等號『=』來連結;
等號兩邊不能直接接空白字元;
變數名稱只能是英文字母與數字,但是數字不能是開頭字元;
若有空白字元可以使用雙引號『 " 』或單引號『 ' 』來將變數內容結合起來,但須要特別留意, 雙引號內的特殊字元可以保有變數特性,但是單引號內的特殊字元則僅為一般字元;
必要時需要以跳脫字元『 \ 』來將特殊符號 ( 如 Enter, $, \, 空白字元, ' 等 ) 變成一般符號;
在一串指令中,還需要藉由其他的指令提供的資訊,可以使用 quote 『 ` command` 』;(特別特別注意,那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號!)
若該變數為擴增變數內容時,則需以雙引號及 $變數名稱 如:『 "$PATH":/home』繼續累加內容;
若該變數需要在其他子程序執行,則需要以 export 來使變數變成環境變數, 如『export PATH』;
通常大寫字元為系統預設變數,自行設定變數可以使用小寫字元,方便判斷 ( 純粹依照使用者興趣與嗜好 ) ;
取消變數的方法為:『unset 變數名稱』。
底下我們舉幾個例子來讓您試看看,就知道怎麼設定好您的變數囉!
範例一:設定一變數 name ,且內容為 VBird 。
[root@linux ~]# 12name=VBird
-bash: 12name=VBird: command not found  <==螢幕會顯示錯誤!因為不能以數字開頭!
[root@linux ~]# name = VBird  <==還是錯誤!因為有空白!
[root@linux ~]# name=VBird    <==OK 的啦!
範例二:承上題,若變數內容為 VBird's name 呢?
[root@linux ~]# name=VBird's name 
# 因為單引號可以將 Enter 這個特殊字符取消,所以,您可以繼續在下一行輸入內容~
# 不過,這與我們要達到的功能不同,所以,算是失敗的啦!
[root@linux ~]# name="VBird's name"  <==OK 的啦!
[root@linux ~]# name=VBird\'s\ name
# 利用反斜線 (\) 跳脫特殊字元,例如單引號與空白鍵,這也是 OK 的啦!
範例三:我要在 PATH 這個變數當中『累加』:/home/dmtsai/bin 這個目錄
[root@linux ~]# PATH=$PATH:/home/dmtsai/bin
[root@linux ~]# PATH="$PATH":/home/dmtsai/bin
# 上面這兩種格式在 PATH 裡頭的設定都是 OK 的!但是底下的例子就不見得囉!
範例四:呈範例三,我要將 name 的內容多出 "yes" 呢?
[root@linux ~]# name=$nameyes 
# 知道了吧?如果沒有雙引號,那麼變數成了啥?name 的內容是 $nameyes 這個變數!
# 呵呵!我們可沒有設定過 nameyes 這個變數吶!所以,應該是底下這樣才對!
[root@linux ~]# name="$name"yes
[root@linux ~]# name=${name}yes
範例五:如何讓我剛剛設定的 name=VBird 可以用在下個 shell 的程序?
[root@linux ~]# name=VBird
[root@linux ~]# bash        <==進入到所謂的子程序
[root@linux ~]# echo $name  <==嘿嘿!並沒有剛剛設定的內容喔!
[root@linux ~]# exit        <==離開剛剛的子程序
[root@linux ~]# export name
[root@linux ~]# bash        <==進入到所謂的子程序
[root@linux ~]# echo $name  <==出現了設定值了!
[root@linux ~]# exit        <==離開剛剛的子程序
# 什麼是『子程序』呢?就是說,在我目前這個 shell 的情況下,
# 去啟用另一個新的 shell ,新的那個 shell 就是子程序啦!在一般的狀態下,
# 父程序的自訂變數是無法在子程序內使用的。但是透過 export 將變數變成
# 環境變數後,就能夠在子程序底下應用了!很不賴吧!至於程序的相關概念,
# 我們會在『程序與資源管理』章節當中提到的喔!
範例六:如何進入到您目前核心的模組目錄?
[root@linux ~]# cd /lib/modules/`uname -r`/kernel
# 每個作業系統核心版本都不相同,以 FC4 為例,他的預設核心版本是
# 2.6.11-1.1369_FC4 所以,他的模組目錄在 /lib/modules/2.6.11-1.1369_FC4/kernel 。
# 因為每個 distributions 的這個值都不相同,但是我們卻可以利用 uname -r 這個指令
# 先取得版本資訊,所以囉,就可以透過上面指令當中的內含指令 `uname -r`
# 先取得版本輸出到 cd .. 那個指令當中,就能夠順利的進入目前核心的驅動程式所放置
# 的目錄囉!很方便吧!
範例七:取消剛剛設定的 name 這個變數內容
[root@linux ~]# unset name

根據上面的案例你可以試試看!就可以瞭解變數的設定囉!這個是很重要的呦!請勤加練習!! 其中,較為重要的一些特殊符號的使用囉!例如單引號、雙引號、跳脫字元、錢字號、quote 符號等等,底下的例題想一想吧!
例題二:在變數的設定當中,單引號與雙引號的用途有何不同?
答:
單引號與雙引號的最大不同在於雙引號仍然可以保有變數的內容,但單引號內僅能是一般字元 ,而不會有特殊符號。我們以底下的例子做說明:假設您定義了一個變數, name=VBird ,現在想以 name 這個變數的內容定義出 myname 顯示 VBird its me 這個內容,要如何訂定呢?
[root@linux ~]# name=VBird
[root@linux ~]# echo $name
VBird
[root@linux ~]# myname="$name its me"
[root@linux ~]# echo $myname
VBird its me
[root@linux ~]# myname='$name its me'
[root@linux ~]# echo $myname
$name its me
發現了嗎?沒錯!使用了單引號的時候,那麼 $name 將失去原有的變數內容, 僅為一般字元的顯示型態而已!這裡必需要特別小心在意!
例題三:在指令下達的過程中, quote ( ` ) 這個符號代表的意義為何?
答:
在一串指令中,在 ` 之內的指令將會被先執行,而其執行出來的結果將做為外部的輸入資訊!例如 uname -r 會顯示出目前的核心版本,而我們的核心版本在 /lib/modules 裡面,因此,你可以先執行 uname -r 找出核心版本,然後再以『 cd 目錄』到該目錄下,當然也可以執行如同上面範例六的執行內容囉。
另外再舉個例子,我們也知道, locate 指令可以列出所有的相關檔案檔名,但是, 如果我想要知道各個檔案的權限呢?舉例來說,我想要知道每個 crontab 相關檔名的權限:
[root@linux ~]# ls -l `locate crontab`
如此一來,先以 locate 將檔名資料都列出來,再以 ls 指令來處理的意思啦!瞭了嗎? ^_^
阅读(910) | 评论(0) | 转发(0) |
0

上一篇:Bash学习(一)

下一篇:Bash学习(三)

给主人留下些什么吧!~~