Bash

哪種引用風格的 GNU Bash 變數定義(主要用於路徑)?

  • February 19, 2019

對於GNU Bash變數,以下哪種引用樣式是首選,為什麼?

  1. 兩個雙引號: VAR="/path/$V1/path with space/$V2" .
  2. 多個雙引號: VAR=/path/"$V1"/"path with space"/"$V2" .
  3. 組合: VAR="/path/"$V1"/path with space/"$V2""
  4. 其他

此處首選的意思是,在盡可能多的情況下按預期工作,而不會不必要地冗長,這樣它就可以一致地使用而不會出現任何問題。如果有(罕見?)特殊情況,請將其限制為文件系統路徑。

假設該path部分可以包含空格或特殊字元。對於2這當然意味著這些path部分也需要被引用。

基本上這似乎歸結為另一個問題:單獨引用變數替換是否有額外的作用?

如果這是真的,那麼它會激勵23(以避免必須path單獨引用每個部分的空格)。如果不是,那麼1似乎是首選,因為它是最簡單的。

但是,在這裡尋找範例,到目前為止,2是最常見的,儘管作為一種特殊情況VAR="$OTHER_VAR"/path/to/something

主要的是:雙引號包含任何形式的擴展或空格的所有字元串,除非您知道不允許這樣做(參見例如“何時需要雙引號? ”)。是否僅引用實際需要引用的位並將靜態的非空白位保留在引號之外並不那麼重要。

我將逐一介紹您的選擇:

  1. VAR="/path/$V1/path with space/$V2"

這是迄今為止最容易閱讀的變體(個人意見)。所有變數擴展都被引用,並且字元串不會在空格上拆分(因為它被引用了)。我會使用這個選項。

正如Sergiy Kolodyazhnyy 在評論中指出的那樣,唯一要記住的是,如果路徑名包含實際的文字雙引號字元,則必須通過將其轉義為\"或臨時終止雙引號字元串並插入來處理a"在單引號字元串中,如"this is a string with a "'"'" in it". 同樣,對於 shell 而言特殊的其他字元,如$\,```在雙引號字元串中也需要相同的處理。請注意,如果在路徑名字元串中擴展的變數包含這些字元之一(將被正確處理) ,這不是問題。 2. VAR=/path/"$V1"/"path with space"/"$V2"

這(恕我直言)看起來有點亂,但有效。它將斜杠之間的所有/大多數路徑組件雙引號。另一種方法可能是在沒有擴展變數的情況下使用單引號:

VAR=/'path'/"$V1"/'path with space'/"$V2"

使用第二個還是第一個選項取決於您和您的個人品味(或您的團隊在您正在處理的項目中使用的任何約定)。如果可能的話,我建議您保持單一約定並且不要在兩者之間混合使用。

兩種“引用路徑名的方式”之間沒有實際區別,除了路徑名可能包含對 shell 來說特殊的文字字元(它們在單引號內不會是特殊的),以及引號的數量用過

你還提到

  • VAR="$OTHER_VAR"/path/to/something

我認為這絕對沒有問題,當路徑的其餘部分是靜態且不包含空格時,我最常使用它。這和絕對沒有區別VAR="$OTHER_VAR/path/to/something"


第三種選擇:

  1. VAR="/path/"$V1"/path with space/"$V2""

不要這樣做。在這裡,$V1並且$V2實際上沒有加引號,因為您終止了變數擴展周圍的雙引號位。

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