Unix/Linux - Shell 引用機制



在本章中,我們將詳細討論 Shell 引用機制。我們將從討論元字元開始。

元字元

Unix Shell 提供了各種元字元,這些字元在 Shell 指令碼中使用時具有特殊含義,並導致單詞終止,除非被引用。

例如,? 在列出目錄中的檔案時與單個字元匹配,而* 匹配多個字元。以下是大多數 Shell 特殊字元(也稱為元字元)的列表:-

* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab

可以透過在字元前加上\來引用(即使其代表自身)。

示例

以下示例顯示瞭如何列印*?:-

#!/bin/sh

echo Hello; Word

執行後,您將收到以下結果:-

Hello
./test.sh: line 2: Word: command not found

shell returned 127

現在讓我們嘗試使用引用的字元:-

#!/bin/sh

echo Hello\; Word

執行後,您將收到以下結果:-

Hello; Word

$ 符號是元字元之一,因此必須對其進行引用以避免 Shell 的特殊處理:-

#!/bin/sh

echo "I have \$1200"

執行後,您將收到以下結果:-

I have $1200

下表列出了四種引用形式:-

序號 引用和描述
1

單引號

這些引號之間的所有特殊字元都失去了其特殊含義。

2

雙引號

這些引號之間的大多數特殊字元都失去了其特殊含義,但以下例外:-

  • $
  • `
  • \$
  • \'
  • \"
  • \\
3

反斜槓

反斜槓後面的任何字元都將失去其特殊含義。

4

反引號

反引號之間的任何內容都將被視為命令並執行。

單引號

考慮一個包含許多 Shell 特殊字元的 echo 命令:-

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
廣告