雙引號與花括號

  • 2019 年 10 月 31 日
  • 筆記

在Tcl中,可通過雙引號「」和花括號{}將多個單詞包括分隔符(例如:換行符和空格)和置換符(例如:美元符號$、方括號[]和反斜杠)等特殊字符組成一組,作為一個參數處理。這實際上也是一種置換操作。區別在於雙引號內的置換正常進行,而花括號內的置換有可能會被阻止,如下圖所示。變量s被賦值為Hello World,注意這裡通過雙引號避免了空格被當作分隔符處理。第一個puts命令使用了雙引號,可以看到所有置換都隨之發生;第二個puts命令使用了花括號,相應的內部置換均被阻止。

雙引號另一常用情形是出現在嵌套命令中,且嵌套的命令是外層命令參數的一部分。例如上圖中的第一條puts命令,內部嵌套了string length命令,而string length命令的返回值是puts命令參數的一部分。如果僅僅是命令嵌套,就不需要雙引號,如下圖所示。

給變量賦值時,也可以通過花括號使特殊字符被當作普通字符處理。如下圖所示。在這個例子中,花括號阻止了$置換。如果將花括號替換為雙引號則會報錯。

如果在一個腳本中同時使用雙引號和花括號會是什麼結果呢?看下面這個例子。給變量b賦值時使用了反斜杠置換,給變量c賦值時使用了雙引號加花括號,其中雙引號在最外層,給變量d賦值時使用了花括號加雙引號,其中花括號在最外層,對比下來可以得出這樣的結論:在同時使用雙引號和花括號時,最外層的做主。

對於花括號,如前文所述「花括號內的置換有可能會被阻止」,這是因為花括號的功能稍微複雜一些,但總的來說遵循兩個原則:第一個原則是如果花括號是用做置換操作,則其內部的置換操作會被阻止;第二個原則是如果花括號用做界限符,如過程定義時用做過程體的邊界、if語句、循環語句(for和while)、switch語句等的邊界以及數學表達式中時,其內部的置換操作不會被阻止。

如果需要雙引號或花括號作為普通字符出現在字符串中時,可通過反斜杠置換,或者通過雙引號和花括號的嵌套使用實現特定功能,如下圖所示。

結論:

-雙引號實現參數分組,不阻止置換;

-花括號實現參數分組,阻止內部置換;

-同時使用雙引號和花括號實現參數分組時,是否置換由最外層符號決定