第7章 通過shell看世界
本章主要介紹的是shell中的擴展和引用,是shell中的一個重要主題。瞭解擴展和引用的工作方式對理解shell內部工作原理和使用shell有很大的幫助。
主要涉及的命令:echo:功能是顯示一行文本。
一:擴展
1:路徑名擴展
通過使用通配符來實現擴展的機制稱爲路徑名擴展。在shell中輸入一個命令後,按下Enter時,bash都會在執行命令之前對文本進行多重處理,類似於預處理,如將通配符擴展成其對應的文本。舉個例子,打開終端輸出 echo *。
如下:
可以發現輸出的並不是*而是當前目錄下的所有文件和目錄名,發生了什麼,回想一下,在前面我們介紹過*意味着“匹配文件名中的任意字符”,在這裏,shell會將*擴展成相應的文本,就是我們看到的內容。
使用前面介紹的通配符,將它們結合起來,可以得到它們的擴展,下面舉幾個例子:
2:波浪線擴展
~具有特殊的意義,如果將它單獨使用,它表示當前用戶的主目錄,如果將它用在指定用戶名的開頭,則會擴展成指定用戶的主目錄。
3:算數擴展
shell支持通過擴展來實現算數表達式,其形式爲:
$((expression))
其中expression是指包含數值和算數操作符的算數表達式,注意這裏算數只支持整數,不包括小數。
下面列出一些支持的運算符:
+,-,*,/,%,**除了最後一個,其他的應該都很熟悉,最後一個運算符表示取冪。2**3表示2的三次方。
可以用一對括號來組合多個子表達式。
有關算數擴展的更加詳細介紹可以參照後面章節的介紹(具體是34章。。。早這呢。。。。)
4:花括號擴展
花括號擴展可能是最奇怪的組合方式了,先看一個實例:
可以看到,花括號擴展可以包含一個稱爲前導的字符作爲開頭部分和一個稱爲符言的結尾部分。話括號裏面可以是由逗號隔開的內容,如上面的例子,
或者是一系列整數或者單個內容。如下面的例子:
花括號一般的應用是創建一系列的文件夾或者文件,這些文件名需要按照一定的規則排列,比如先按年份,再按日期等等,這時候就可以使用嵌套的花括號擴展。如下面的例子:
5:參數擴展
這裏僅僅簡要地介紹參數擴展,以後還會更加深入地介紹它。事實上,參數擴展在shell腳本中比直接用在命令行中更爲有用。
在這裏,參數更類似於高級語言中的變量,比如,我們將當前用戶的主目錄命名爲HOME,將當前用戶的名字命名爲USER,我們可以在終端中輸出這些參數的值:
對於參數擴展中,如果輸錯參數名,仍然會進行擴展,這時候會擴展成一個空字符。
6:命令替換
命令替換是將一個命令的輸出作爲一個擴展模式使用,具體格式爲
&(commad)
它將命令的輸出當作是一個擴展模式,可以應用到前面提到的幾種命令模式中。
二:引用
上面提到,shell有多種方式可以實現擴展,現在來學習如何控制擴展。
這裏有個例子:
我們發現 $1沒有被輸出,shell將$1到成石擴展,這時候沒有名爲1的參數,所以shell將1擴展成一個空字符。
這時候顯然我們並沒想到要用到擴展,所以需要有一種機制來避免不必要的擴展。
1:雙引號
先來介紹第一種引用類型,雙引號,將文本放在雙引號中,則shell將會把包含在雙引號之間的內容看成是一個整體,而不會被空格,製表符和換行符分割。舉個例子,如果一個文件的名字爲 just a test。我們想要訪問他的時候,如果直接輸入 just a test,會出現錯誤:
當使用雙引號時,將會得到正確結果:
當不使用雙引號時,shell會將他們認爲是三個參數,加了之後會把雙引號中的內容當成一個參數。
注意:雙引號中,參數擴展,算數擴展和命令替換依然生效。所以就算加了雙引號也不能解決我們一開始的問題:
如果想要抑制所有的擴展,要是用單引號。
2:單引號
使用單引號可以取消所有的擴展:
3:轉義字符
有時候我們只是想要使用單個字符,而不用抑制所有的擴展,這個時候可以使用轉義字符,通過在這個字符前加上反斜槓實現。
這裏的反斜槓稱爲轉義字符。轉義字符也用來消除文件名中的某個特殊字符,常用的轉義字符如下所示:
\a 響鈴
\b 退格
\n 換行
\r 回車
\t 製表符
\$ 字符$
\\ 字符\
......
隨着我們深入學習shell,就會發現擴展和引用的使用頻率逐漸多起來,所以很有必要很好地瞭解它們的工作方式。如果不能正確地理解擴展,那麼shell將會是個神祕和讓人困惑的資源,它的潛在能力也就被浪費了。