2012-08-15 40 views
38

我需要一個字符串傳遞給程序從猛砸CLI它的參數,如美元符號如何影響Bash中的單引號?

program "don't do this" 

字符串可以包括像'$'任何字符,'\',等等,我不想猛砸做任何修改。所以我想用單引號。

但是以下不工作:

program 'don\'t do this'   //escape doesn't work in single quote 

雖然下面的兩件作品:

program $'dont\'t do this'   //seems fine, but any other side effects? 
program 'dont'\''do this'   //breaking into 3 parts 

第一種方法似乎是它獲得預修改遜色(把美元符號在前面並且每\替換爲\\),但我不知道美元符號可以做什麼。

我真的GOOGLE了這一點,但我無法找到我所需要的...

+4

爲了更好地理解'$「...」'例子,看看[bash的信息頁面]第一款(http://www.gnu.org/software/bash /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-報價) – suvayu 2012-08-15 08:53:26

+0

感謝您發佈此問題。理解如何對齊製表符分隔的記錄(即'cat myData.tsv | column -t -s $'\ t'') – 2017-03-20 23:26:23

回答

48

它會導致被解釋轉義序列。

$ echo $'Name\tAge\nBob\t24\nMary\t36' 
Name Age 
Bob  24 
Mary 36 

(所以在處理一個傻傻的方式選項卡,所以嘗試這一個主場)

+0

+1是非常重要的。我想這是因爲變量名擴展了嗎? – 2012-08-15 08:49:29

+0

不,發生這種情況是因爲它是'$'...''定義的行爲。 – 2012-08-15 08:50:01

+0

這正是我所需要的,如果這全是$''呢! – user1206899 2012-08-15 09:29:26

18

使用$作爲前綴告訴Bash試圖找到具有該名稱的變量。 $'是啓用ANSI-C字符串處理的特殊語法(fully explained here)。在這種情況下,單個時間表不是「直到下一個單個時間點才逐字記錄」。它應該是相當安全的使用。缺點是隻有BASH而且不常見,所以很多人會想知道它的意思。

更好的方法是使用單引號。如果您需要單個字符串中的單引號,則需要用'\''替換它。這會結束前面的單引號字符串,向它添加一個單引號(\'),然後啓動一個新的單引號字符串。這種語法適用於Bourne shell的任何後裔,這很容易理解,大多數人很快就會認識到這種模式。

另一種方法是用'"'"'代替每個單獨的勾號,這意味着「終止當前單引號字符串,附加雙引號字符串,其中只包含一個單引號,重新啓動單引號字符串」。這避免了轉義字符,看起來很好對稱。如果您需要雙引號字符串中的雙引號,它也可以用其他方式工作:"'"'"

+0

是的,這是正確的方式 – user1206899 2012-08-15 09:57:21

+2

看到''「'」''也很常見。例如''''狗''''的尾巴' – 2012-08-15 13:17:05

+0

$'SHELL'和$'LANG'將*不*失敗*。美元符號$'具有不同的功能。我會說'\''是一種正確的方式。 – jox 2014-10-14 08:53:07

-1

你不會找到一個比一個更快或更有效的方式:

eval RESULT=\$\'$STRING\' 

原因之一,這是什麼樣的事情,EVAL是有,你避免分叉子的瘋狂的代價正如前面的答案似乎表明的那樣。你的榜樣:

$ foo='\u25b6' 
$ eval bar=\$\'$foo\' 
$ echo "$bar" 
▶ 
+0

這是對語法在Bash中意味着什麼的誤解。 '$'...''是[C風格的字符串](http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting),它遵循與普通字符串不同的引用規則,如本頁其他答案中所述。 – tripleee 2017-08-11 03:53:24