C shell 中的變數替代

C shell 維持一組變數,每一個變數都有自己的值,這個值可能是一列 0 或多個字組。由 shell 設定或參照一部分這些變數。例如,argv 變數是 shell 變數清單的影像,而構成此變數值的字組會以特殊方式來參照。

若要變更及顯示變數值,請使用 setunset 指令。在 shell 參照的變數中,有一些是輪換(用來開啟及關閉的變數)。shell 查不出值的輪換, 只有查出它們是設定或取消設定。例如,verbose shell 變數是一個會使指令輸入產生回應的輪換。在指令行發出 -v 旗標而產生此變數的設定。

其他作業以數字處理變數。@ 指令執行數值計算,而且結果是指派給變數的。然而一定以字串(零或更多)來表現變數值。就數值運算而言,空字串被視為零,並且忽略多字值的第二個字和後續字組。

發出某個指令之後,shell 會剖析輸入行並執行別名替代。接下來它會執行變數替代之後才執行指令。$ 字元鍵替代。然而,其後若接著空格、跳格字元或換行字元,則略過並維持不變。除了下列兩種情況以外,在 $ 字元之前加上 \(反斜線)可防止這種擴充:

  • 指令以 " " 來含括。在此情形下,shell 一定執行替代。
  • 指令以 ' ' 來含括。在此情形下,shell 不執行替代。以 ' ' 含括的字串會被解譯,執行指令替代

擴充變數之前,shell 會辨識輸入和輸出重新導向,然後各別地擴充每一個變數。否則,會同時擴充指令名稱和完整引數清單。因此第一個(指令)字有可能產生一個以上的字, 第一個字會變成指令名稱,其餘的字則變成參數。

除非以 " " 括住,或提供 :q 修飾元,否則變數替代的結果最後可能會附屬於指令和檔名替代。被雙引號括住時,具有一個含有多字的值的變數會擴充為單一字組或單一字組的一部分,同時由空白隔開變數值的字組。將 :q 修飾元應用於某個替代時,變數會擴充成多個字。以空格隔開每一個字,並且用雙引號括住該字,以防止被後面的指令或檔名替代。

下列表示法可讓您將變數值導入 shell 輸入。除了上述情況以外,參照一個不是使用 set 指令設定的變數是錯誤的。

您可以將修飾元 :gh :gt:gr:h :r :q:x 應用於下列替代中。如果 { }(大括弧)出現在指令表格中,則修飾元必須放在大括弧內。每個變數擴充上只能有一個 : 修飾元。


項目 說明
$Name   
${Name} 會被指派給 Name 變數的字組所取代,以空格隔開每一個字組。成對的大括弧將 Name 變數與下列所有字元隔開;若未隔開的話,下列字元會成為變數的一部分。shell 變數名稱以字母作為開頭,且最多可包含 20 個字母和數字,其中包括底線字元 (_)。若 Name 變數沒有指定 shell 變數,但已設定於此環境,則會傳回它的值。前面加上冒號的修飾元以及此處說明的其他格式不適用於這種情況。
$Name[number]    
${ Name[number ]} 僅選取 Name 變數值中的部分字組。數字受限於變數替代,並且可能包含單一數字或由連字號 (-) 隔開的兩個數字。 變數字串值的第一個字是編號 1。若省略某範圍的第一個數字,則會預設成 1。若省略某範圍的最後一個數字,則會預設成 $#Name。星號 (*) 符號會選取全部字組。若省略第二個引數或它是位於某範圍,則空的範圍不算錯誤。
$#Name  
${#Name} Name 變數中提供字數。這可以用在 [number] 中,如上述。例如,$Name[$#Name]
$0 替換從它那裡讀取指令輸入的檔名。若不知道此檔名則會發生錯誤。
$number  
${number} 相當於 $argv[number]
$* 相當於 $argv[*]

下列的替代可能不會隨著 : 修飾元一起改變:

項目 說明
$?name   
${?name} 若已設定 name 變數,則替換字串 1;若未設定此變數,則替換字串 0(零)。
$?0 若已知現行輸入檔名稱,則會替換 1;若不知道檔案名稱,則替換 0(零)。
$$ 替換母項 shell 的(十進位)處理號碼。
$< 替換標準輸入的某一行,但沒有進一步解譯。在 shell 程序中使用此替代來從鍵盤讀取。