Shell
shell 變數的擴展以及 glob 和 split 對它的影響
這篇文章實際上包含兩個單獨的問題,但我認為將它們組合在一起會提供更多背景資訊。我已經在圍繞變數的引號中完成了這個問題,但我不太明白變數擴展首先意味著什麼。所以我的第一個問題是:
- 什麼是unix/linux 語言中的變數擴展?
我的問題的第二部分涉及以下術語:
- 地球
- 分裂
以上是什麼意思,它們如何影響變數擴展?原始問題的答案提到以下內容:
將不存在引號(在列表上下文中)視為 split+glob 運算符。
彷彿迴聲 $ test was echo glob(split(" $ 測試”))。
我找不到任何直接解決通配和拆分概念的**答案,而是直接使用這些術語來回答其他問題,例如最近的問題。
變數擴展(標準術語是參數擴展,有時也稱為變數替換)基本上是指用變數的值替換變數。更準確地說,它意味著用一些其他文本替換
$VARIABLE
構造(或${VARIABLE}
或${VARIABLE#TEXT}
或其他構造),這些文本是從變數的值建構的。這個其他文本是變數的擴展。擴展過程如下。(我只討論常見情況,一些 shell 設置和擴展會修改行為。)
- 取變數的值,它是一個字元串。如果未定義變數,請使用空字元串。
- 如果構造包含轉換,則應用它。例如,如果構造是
${VARIABLE#TEXT}
,並且變數的值以 開頭TEXT
,則從值的開頭刪除TEXT
。- 如果上下文需要一個單詞(例如在雙引號內,或在作業的右側,或在此處文件內),請在此處停止。否則繼續下一步。
- 在每個空格序列處將值拆分為單獨的單詞。(該變數
IFS
可以更改為在除空格以外的字元處拆分。)因此結果不再是字元串,而是字元串列表。如果值僅包含空格,則此列表可以為空。- 將列表的每個元素視為文件名萬用字元模式,即**glob**。如果模式與某些文件匹配,則將其替換為匹配文件名列表,否則將不理會。
例如,假設變數
foo
包含且a* b* c*
目前目錄包含文件bar
和。然後展開如下:baz``paz``${foo#??}
- 變數的值是 8 個字元的字元串
a* b* c*
。#??
表示去掉前兩個字元,得到 6 個字元的字元串b* c*
(帶有初始空格)。- 如果擴展是在列表上下文中(即不在雙引號或其他類似上下文中),請繼續。
- 將字元串拆分為以空格分隔的單詞,從而生成一個包含兩個字元串的列表:
b*
和c*
.- 字元串
b*
被解釋為模式,匹配兩個文件:bar
和baz
. 該字元串c*
不匹配任何文件,因此它被單獨保留。結果是三個字元串的列表:bar
,baz
,c*
。例如
echo ${foo#??}
列印bar baz c*
(命令echo
將其參數與中間的空格連接起來)。有關更多詳細資訊,請參閱: