Shell 引用機製
元字符:
UNIX Shell提供各種元字符有特殊的意義,同時利用他們在任何Shell腳本,並導致終止一個字,除非引用。
舉個例子: ?匹配一個單一的係統字符,而列出文件中的目錄和*匹配多個字符。下麵是一個清單shell特殊字符(也稱為元字符):
* ? [ ] ' " $ ; & ( ) | ^ < > new-line space tab
它與前可能被引用的字符(例如,放置自身) .
例子:
下麵的例子,顯示了如何打印 a * 或 a ?:
#!/bin/sh echo Hello; Word
這將產生下麵的結果。
Hello ./test.sh: line 2: Word: command not found shell returned 127
現在,讓我們嘗試使用帶引號的字符:
#!/bin/sh echo Hello; Word
這將產生以下結果:
Hello; Word
$符號是一個元字符,所以它必須被引用,以避免特殊處理:
#!/bin/sh echo "I have $1200"
這將產生以下結果:
I have $1200
是以下四種形式引用:
引用 | 描述 |
---|---|
Single quote | All special characters between these quotes lose their special meaning. |
Double quote |
Most special characters between these quotes lose their special meaning with these exceptions:
|
Backslash | Any character immediately following the backslash loses its special meaning. |
Back Quote | Anything in between back quotes would be treated as a command and would be executed. |
單引號:
考慮echo命令,其中包含許多特殊的shell字符:
echo <-$1500.**>; (update?) [y|n]
將在每個特殊字符前的反斜杠是繁瑣的,使該行難以閱讀:
echo <-$1500.**>; (update?) [y|n]
有一個簡單的方法來引用一大組字符。將一個單引號(')的開頭和結尾的字符串:
echo '<-$1500.**>; (update?) [y|n]'
單引號內的任何字符均以一個反斜杠,就好像是在前麵的每個字符。所以,現在這個echo命令將顯示正確。
如果要輸出一個字符串內出現一個單引號,你不應該把單引號內的整個字符串,而不是對子進行使用反斜杠()如下:
echo 'It's Shell Programming'
雙引號:
嘗試執行以下shell腳本。這個shell腳本使用單引號:
VAR=ZARA echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'
這將產生以下輸出結果:
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
所以這不是你想顯示什麼。很明顯,單引號防止變量替換。如果想替換的變量值和倒置逗號如預期那樣運作,那麼就需要在雙引號命令如下:
VAR=ZARA echo "$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]"
這將產生以下結果:
ZARA owes <-$1500.**>; [ as of (07/02) ]
雙引號帶走下列以外的所有字符的特殊含義:
-
$ 參數替代。
-
用於命令替換的反引號。
-
$ 使字麵美元標誌。
-
` 使文字反引號。
-
" 啟用嵌入式雙引號。
-
\ 啟用嵌入式反斜杠。
-
所有其他字符是文字(而不是指定)。
單引號內的任何字符均以一個反斜杠,就好像是在前麵的每個字符。所以,現在這個echo命令將顯示正確。
如果要輸出一個字符串內出現一個單引號,不應該把單引號內的整個字符串,而不是對子進行使用反斜杠()如下:
echo 'It's Shell Programming'
反引號:
把反引號之間的任何shell命令將執行命令
語法
下麵是一個簡單的語法,把反引號之間的任何Shell命令:
例子:
var=`command`
例子:
繼執行date命令,產生的結果將被存儲在 DATA 變量。
DATE=`date` echo "Current Date: $DATE"
這將產生以下輸出結果:
Current Date: Thu Jul 2 05:28:45 MST 2009