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