1,寫在前面
這是系列學習文檔,基於互連網的分享精神,主要來源於論壇上的shell專區,有整理而來,本身是一本書上的內容,所以著作權麼屬於書的原作者,這裡我們只做學習材料,其實這幾篇文檔整理還是很飛逝間的,畢竟論壇上格式還是比較難以閱讀的,起碼沒什麼樂趣,當然還是向斑竹表示敬意,如果您覺得此系列文章不妥,請告知。
這個系列文檔大概有六篇左右,講的屬於基本入門的東西,作為營運來說,掌握一些指令碼知識是必要的。同時我也會寫幾篇學習筆記,主要是作為自己的備忘錄,沒事遺忘的時候可以翻翻。
以後將附上學習備忘錄。
2,開篇第一章
這裡面本來有環境變數和shell變數知識,由於比較簡單,不再轉了,大家網上搜尋一下都應該沒問題的。
我們從引號轉載:
我整理如下:
2.1引用必要性
這裡只講述引用的基本規則。因為使用引用的例子很多。本書接下來的兩個部分將一一予以講述。指令碼中執行行操作時, shell將對指令碼設定予以解釋。要採取一種方法防止shell這樣做,即使用引用號,包括各式引用或使用反斜線。
一些使用者在對文本字串進行反饋操作時覺得使用引用很麻煩。有時不注意,只引用了一半,這時問題出現了。
最好在反饋文本字串時使用雙引號。
下面是各種引用的例子。
echo Hit the star button to exit *
Hit the star button to exit child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
文本返回了,但由於未使用雙引號, *被shell誤解,shell認為使用者要做目錄列表。用雙引號得結果如下:
echo "Hit the star button to exit *"
Hit the star button to exit *
這樣就不會有誤解產生。表1 5 - 1列出各種參考型別。
表15-1 shell參考型別
" " 雙引號 ` 反引號(這個準確說是法語裡面的符號)
' ' 單引號 \ 反斜線
2.1.1 雙引號
使用雙引號可引用除字元$、`、\外的任一字元或字串。這些特殊字元分別為貨幣符號,反引號和反斜線,對shell來說,它們有特殊意義。如果使用雙引號將字串賦給變數並反饋它,實際上與直接反饋變數並無差別。
STRING="MAY DAY, MAY DAY, GOING DOWN"
echo "$STRING"
MAY DAY, MAY DAY, GOING DOWN
$ echo $STRING
MAY DAY, MAY DAY, GOING DOWN
現在假定要設定系統時間輸出到變數mydate.
MYDATE="date"
echo $MYDATE
date
因為shell將" "符號裡的字串賦予變數mydate,date已沒有特定意義,故此變數只儲存單詞date。如果要查詢包含空格的字串,經常會用到雙引號。以下使用grep抽取名字"Davey Wi r e",因為沒有加雙引號,grep將"Davey"認作字串,而把“Wire”當作檔案名稱
$ grep Davey Wire /etc/passwd
$ grep: Wire: No such file or directory
$ grep "Davey Wire" /etc/passwd
要解決這個問題,可將字串加雙引號。這樣shell忽略空格,當使用字元時,應總是使用雙引號,無論它是單個字串或是多個單詞。
在一個反饋的文本行裡可以使用雙引號將變數引起來。下面的例子中,shell反饋文本行,遇到符號$,知道這是一個變數,然後用變數值boy替換變數$BOY。
$ echo " The $BOY did well"
The boy did well
$ echo " The "$BOY" did well"
The boy did well
單引號與雙引號類似,不同的是shell會忽略任何引用值。換句話說,如果屏蔽了其特殊含義,會將引號裡的所有字元,包括引號都作為一個字串。使用上一個例子,結果如下:
$ GIRL='girl'
$ echo "The '$GIRL' did well"
The 'girl' did well
2.1.2 反引號
反引號用於設定系統命令的輸出到變數。shell將反引號中的內容作為一個系統命令,並執行其內容。使用這種方法可以替換輸出為一個變數。反引號可以與引號結合使用。下面將舉例說明。
下面的例子中, shell試圖替代單詞hello為系統命令並執行它,因為hello指令碼或命令不存在,返回錯誤資訊。
$ echo `hello`
bash: hello: command not found
$ echo `date`
Sat Nov 20 21:40:47 CST 2010
這次命令有效,shell正確執行.下面將命令輸出設定為變數mydate,時間格式如下
$ date +%A" the "%e" of "%B" "%Y
Saturday the 20 of November 2010
$ mydate=`date +%A" the "%e" of "%B" "%Y`
$ echo $mydate
Saturday the 20 of November 2010
$ mydate=`date`
$ echo $mydate
Sat Nov 20 21:43:06 CST 2010
另一個例子中,將反引號嵌在雙引號裡:
$ echo "The date today is `date`"
The date today is Sat Nov 20 21:44:03 CST 2010
$ echo "There are `who | wc -l` users on the system"
There are 3 users on the system
上面的例子中,列印字串後,shell遇到反引號,將其看作一條命令執行它。
如果下一個字元有特殊含義,反斜線防止shell誤解其含義,即屏蔽其特殊含義。下述字元包含有特殊意義: & * + ^ $ ` " | ?。
假定echo命令加*,意即以串列順序列印當前整個目錄列表,而不是一個星號*.
$ echo *
ild.sh father.sh findfile.sh param2.sh param.sh who_is.sh
為屏蔽星號特定含義,可使用反斜線。
$ echo \*
*
上述語句同樣可用於$$命令, shell解釋其為現在進程ID號,使用反斜線屏蔽此意,僅打
印$$。
$ echo $$
7906
$ echo \$$
$$
在列印字串時要加入八進位字元(ASCII相應字元),必須在前面加反斜線,否則shell將其當作普通數文書處理。
$ echo " This is a copyright 251 sign"
This is a copyright 251 sign
$ echo -e " This is a copyright \0373 sign"
This is a copyright
Linux下需要使用\0NNN的八進位的方式才可以把特殊字元copyright的字元顯示出來。
使用命令expr時,用*表示乘法會出現錯誤,在*前加上反斜線才會正確。
$ expr 12 * 12
expr: syntax error
$ expr 12 \* 12
144
在echo命令中加入元字元,必須用反斜線起屏蔽作用。下面的例子要顯示價格$19.99。其中$屏蔽與不屏蔽將產生不同的結果。
$ echo "That video looks a good price for $19.99"
That video looks a good price for 9.99
$ echo "That video looks a good price for \$19.99"
That video looks a good price for $19.99
使用反斜線屏蔽$,可得更好的結果。
在引用時會遇到一些問題且經常出錯。我在使用引用時遵循兩條規則:
1) 反饋字串用雙引號;但不要引用反饋本身。
2) 如果使用引用得到的結果不理想,再試另一種,畢竟只有三種引用方式,可以充分嘗試。
3,學習備忘
上面的內容有些地方不是太正確。
1,反引號
裡面關於雙引號的嵌套
樣本: $ mydate=`date +%A" the "%e" of "%B" "%Y`
$ echo $mydate
可以試試去掉雙引號的效果,會提示你date: 額外的運算元 "the"請嘗試執行"date --help"來擷取更多資訊。
其實這裡面引號匹配要看清楚分別是" the "," of "," ",按照文檔所述""中只有\,`,$符號轉義,其他照常輸出的,所以不要誤認"%e"是雙引號匹配的。
有興趣驗證echo "%e",挺有意思的。
2,echo *
shell裡面有些特殊含義字元如: & ` " | ?
如果想屏蔽特殊含義,需要反斜線\,
試試echo * 和echo \*,而echo $,*,+,^,?都可以正常輸出,這點好像教材將錯了。
應該是打錯了,真正還有些特殊字元。<,>,\,(,),;,~,#,其中#;符號無輸出。~輸出使用者路徑。其他均無法直接輸出。
3,expr
expr 12*12
輸出 12*12,認為是第一個運算元,要用空格分開,如expr 12 * 12方可,同時加上反斜線\,expr 12 \* 12