2014-05-13 42 views
1

在C#中,有一個逐字字符串,這樣,shell中是否存在忽略轉義字符的方法?

string c = "hello \t world";    // hello  world 
string d = @"hello \t world";    // hello \t world 

我是新來的shell腳本,有沒有在外殼類似的方法?

因爲我有很多文件夾的名稱,如「服裝&配件>服裝>運動裝」,我想知道是否有一個簡單的方法來處理轉義字符而不寫這麼多。

test.sh 

director="Apparel & Accessories > Clothing > Activewear" 
# any action to escape spaces, &, > ??? 
hadoop fs -ls $director 
+1

爲外殼,你可以附上引號來代替轉義特殊字符之內的全部文本。 – mah

+1

單引號,用「此處文檔」,實際上,你可以放在引號製表符和換行不使用轉義序列 – technosaurus

回答

3

對於definining的特定字符串在你的榜樣,Apparel & Accessories > Clothing > Activewear要麼雙引號單引號將工作; 到後來是一個不同的故事,但是:

外殼(任何POSIX兼容的shell),你如何引用一個變量就如你如何定義作爲重要的IT 。

爲了安全地到先前定義的變量無副作用,它括在雙引號,例如,"$directory"

定義 [變量作爲]一個字面(逐字)字符串

(與此相反,以限定具有嵌入變量引用的變量嵌入的命令置換嵌入式算術表達式,使用double")。)

  • 如果字符串包含NO 單引號

    • 使用單引號的字符串,例如:

      directory='Apparel & Accessories > Clothing > Activewear' 
      

A 單引號字符串不受shell的任何解釋,所以它的通常是用於定義文字的最安全選項。請注意,該字符串可能會跨越多行;例如:

 multiline='line 1 
     line 2' 
  • 如果字符串確實包含引號(例如,I'm here.),你想一個解決方案,作品所有 POSIX兼容的外殼

    • 將字符串分解爲多個(單引號)部分和s在單引號字符 PLICE:

注:可悲的是,單引號字符串不能包含單引號,甚至不逃避

 directory='I'\''m here.' 

該字符串被分成成單引號I,接着字面'(逃脫作爲無引號字符串作爲\'),其次是單引號m here.。由於零件之間沒有空格,結果是單個字符串包含I後面的文字單引號。

替代:如果您做使用多語句不介意,你可以使用這裏引用文件,在底部描述。

  • 如果字符串確實包含引號(例如,I'm here.),你想一個解決方案,作品bashkshzsh

    • 使用ANSI -C引用

      directory=$'I\'m here.' 
      

注:如你所見,ANSI-C報價允許逃逸單引號爲\',但要注意額外的影響:其他\<char>序列受到解釋,太;例如,\n被解釋爲換行符 - 見http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting


提示的帽子@chepner的,誰指出,直接包括字符串中的單引號POSIX兼容的方式來逐字使用是使用引述開口定界符(該-r選項確保在字符串中\字符被作爲文字處理)來使用read -rhere document

# *Any* form of quoting, not just single quotes, on the opening EOF will work. 
# Note that $HOME will by design NOT be expanded. 
# (If you didn't quote the opening EOF, it would.) 
read -r directory <<'EOF' 
I'm here at $HOME 
EOF 
  • 注意的是,這裏的文件創建標準輸入輸入(其中read在這種情況下讀取)。因此,您不能使用此技術直接將結果字符串作爲參數傳遞。
+0

@chepner:謝謝你的貢獻,我很感激。 – mklement0

2

使用強引號,即「字符串」,允許逃生char或特殊字符字符串。

e.g. declare director='Apparel & Accessories > Clothing > Activewear' 

也使用declare是同時聲明變量一個很好的做法。

+1

這並沒有解決*擴展*'$ director'的問題。 – chepner