Shell

shell 變數的擴展以及 glob 和 split 對它的影響

  • January 13, 2014

這篇文章實際上包含兩個單獨的問題,但我認為將它們組合在一起會提供更多背景資訊。我已經在圍繞變數的引號中完成了這個問題,但我不太明白變數擴展首先意味著什麼。所以我的第一個問題是:

  1. 什麼是unix/linux 語言中的變數擴展?

我的問題的第二部分涉及以下術語:

  1. 地球
  2. 分裂

以上是什麼意思,它們如何影響變數擴展?原始問題的答案提到以下內容:

將不存在引號(在列表上下文中)視為 split+glob 運算符。

彷彿迴聲 $ test was echo glob(split(" $ 測試”))。

我找不到任何直接解決通配和拆分概念的**答案,而是直接使用這些術語來回答其他問題,例如最近的問題。

變數擴展(標準術語是參數擴展,有時也稱為變數替換)基本上是指用變數的值替換變數。更準確地說,它意味著用一些其他文本替換$VARIABLE構造(或${VARIABLE}${VARIABLE#TEXT}或其他構造),這些文本是從變數的值建構的。這個其他文本是變數的擴展。

擴展過程如下。(我只討論常見情況,一些 shell 設置和擴展會修改行為。)

  1. 取變數的值,它是一個字元串。如果未定義變數,請使用空字元串。
  2. 如果構造包含轉換,則應用它。例如,如果構造是${VARIABLE#TEXT},並且變數的值以 開頭TEXT,則從值的開頭刪除TEXT
  3. 如果上下文需要一個單詞(例如在雙引號內,或在作業的右側,或在此處文件內),請在此處停止。否則繼續下一步。
  4. 在每個空格序列處將值拆分為單獨的單詞。(該變數IFS可以更改為在除空格以外的字元處拆分。)因此結果不再是字元串,而是字元串列表。如果值僅包含空格,則此列表可以為空。
  5. 將列表的每個元素視為文件名萬用字元模式,即**glob**。如果模式與某些文件匹配,則將其替換為匹配文件名列表,否則將不理會。

例如,假設變數foo包含且a* b* c*目前目錄包含文件bar和。然後展開如下:baz``paz``${foo#??}

  1. 變數的值是 8 個字元的字元串a* b* c*
  2. #??表示去掉前兩個字元,得到 6 個字元的字元串b* c*(帶有初始空格)。
  3. 如果擴展是在列表上下文中(即不在雙引號或其他類似上下文中),請繼續。
  4. 將字元串拆分為以空格分隔的單詞,從而生成一個包含兩個字元串的列表:b*c*.
  5. 字元串b*被解釋為模式,匹配兩個文件:barbaz. 該字元串c*不匹配任何文件,因此它被單獨保留。結果是三個字元串的列表:bar, baz, c*

例如echo ${foo#??}列印bar baz c*(命令echo將其參數與中間的空格連接起來)。

有關更多詳細資訊,請參閱:

引用自:https://unix.stackexchange.com/questions/108963