題 在bash中,我如何逃避感嘆號?


我想做點什麼 bzr commit -m "It works!"。我可以通過這樣做來逃避感嘆號 bzr commit -m "It works\!"。但是,我的提交消息包含反斜杠。如何逃避感嘆號,同時仍然忽略反斜杠?


165
2018-04-22 18:53


起源


幹 bzr commit -m "It works"! 也有效。 - kba
正如我之前所說,你輸入的命令確實可以自己運行:) bzr commit -m "It works!" - h4unt3r
嵌套引號的奇怪案例: stackoverflow.com/questions/22125658/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
雖然接受的答案對於您的提交問題是一個很好的解決方法,但我覺得這不是實際問題的答案: Bash歷史擴張。請考慮接受丹尼斯的回答? - Arjan


答案:


由於您不依賴於bash來擴展提交消息中的變量,因此您可以使用單引號。單引號中的字符串不會被bash擴展。

bzr commit -m 'This does work!' 

136
2018-04-22 19:31



因為問題是“如何逃避感嘆號?”而不是“我怎麼不擴大感嘆號?”我不認為這是有效的。有些時候(比如在同一命令行中傳遞撇號和感嘆號),這不起作用。以下答案可以更好地滿足許多人的需求。 - Jann
@Jann:你是100%正確的,但我認為這裡的問題是關於超級用戶的問題:我們是否回答了問題,或者我們是否幫助人們解決他們的具體問題。我認為這兩種方式都很有用,而且這是在尋找特定問題的幫助。 - Benjamin Bannier
德勤!這是一個具體問題。我傾向於想要回答我的問題,以便能夠在許多情況下使用。 pS:我甚至提到這個的原因是我需要將撇號和感嘆號都傳遞給perl程序,我需要以下解決方案。 :) - Jann
我同意Benjamin和Jann的意見,但是我做了一個downvote。問題的標題由搜索引擎索引,這就是我來到這裡的方式,也許大多數用戶來到這裡。這就是為什麼我認為實際問題反映其背後的問題非常重要。在其他論壇中,人們被建議(幾乎被迫)準確地詢問他們尋找什麼。回答表達不好的問題支持邋iness,這就是我在這裡投票的確切原因。作為妥協/解決方案,我的建議是幫助調整標題,以便反映實際問題。 - ChristophK


老問題我知道,但對於未來的搜索者:

如果您想要雙引號以及感嘆號,也可以使用此方法:

echo "It's broken"'!'

即使這個也行 ! 不在最後。

例如:

echo "hello there"'!'" and goodbye"

獎勵:可以使用類似的技術來逃避 任何 Sh或Bash中的文本(在sed的幫助下):參見第一個選項 這個答案。此外,如果你有 bash-completion 安裝,你可能有 quote() 功能 已經可用了。


141
2018-06-23 19:16



不錯的提示,JWD。我沒有意識到bash字符串可以簡單地通過省略它們之間的空格來連接。 - Alan H.
實際上,如果感嘆號位於字符串的末尾,那麼你就是清晰的 echo "Happy birthday!" 將按預期工作,否則你可以用反斜杠逃避它,但反斜杠將打印XD Bash不適合膽小的人:) - h4unt3r
@ h4unt3r:奇怪,那不是我的經歷。為了我, echo "Happy Birthday!" 輸出2行。首先是 echo "Happy birthday" (沒有感嘆號),第二個是“生日快樂”(再次,沒有感嘆號)。進行此測試時,您是否開啟了歷史記錄擴展? - jwd
@jwd你在運行什麼版本的bash?我總是有擴展。你不小心使用了兩個!!為了你的考試? - h4unt3r
@ h4unt3r: version 4.1.2(1)-release (x86_64-redhat-linux-gnu),絕對只有一個 ! 正在使用。我有 histexpand 介紹 $SHELLOPTS。但是,我只是嘗試4.3.18(2) - 在另一台機器上發布,它的行為和你描述的一樣。我想這是一個修復過的bug。 - jwd


關掉 歷史擴張

set +H

要么

set +o histexpand

63
2018-04-22 18:58



謝謝 - 這很有效,但我必須這樣做 set +o histexpand不是 set -o histexpand。你可以編輯你的答案來解決這個問題嗎? - Matthew
哎呀,錯字,對不起。固定。 - Dennis Williamson
外觀極好!正在尋找這個AGES .... thx vm!因為逃避不會工作...我也不想使用單引號...我會將此添加到我的 .bashrc thx !!,從未使用過 ! 在腳本中,沒有任何東西!這總是令人不安...... - Aquarius Power
這太棒了! echo "@AquariusPower!" - joehanna


使用單引號(')而不是雙引號(“)。單引號關閉對它們內容的所有解釋,而雙引號僅關閉一些。

bzr commit -m 'It works!'

9
2018-04-22 19:32





我剛剛找到另一種方式,至少可以使用 echo想要用驚嘆號標點的字符串(句子)。它或多或少地圍繞Bash histexpand進行最終運行,並且只需要更長的代碼。

感嘆號的十六進制,如上所列 http://www.ascii-code.com/,是21,所以如果你把 \x21 在你的字符串的末尾, echo -e $foo,使 $foo 它自己的擴展迴聲[即, foo=$(echo -e "$foo")],你得到什麼 echo $foo 再一次是帶有一個字符串 ! 在末尾。而且也沒有切換histexpand。

在Bash 4+中肯定可以使用。早期版本,ymmv。


4
2017-11-23 04:28



嗯,這對我不起作用。 - lzap