簡體   English   中英

帶引號的Bash參數擴展$ {parameter / pattern / string}

[英]Bash parameter expansion ${parameter/pattern/string} with quotes

這是我關於SO的第一篇文章(雖然很長一段時間),所以我提前為許多“失禮”和其他錯誤道歉。

我一直在谷歌上尋找一段時間試圖找到一個答案,當內部參數擴展內部雙引號時,如何解析引號,似乎我有錯誤的關鍵字或非常扭曲的頭腦嘗試這個。

例如,如果我有一個字符串,比如It's a complicated string ,我想將該字符串轉換為序列It'\\''sa complicated string使用bash的參數擴展${parameter/pattern/string} It'\\''sa complicated string 我知道我可以使用許多其他內置工具或外部工具之一來實現這一結果(我非常喜歡自己),但這個問題實際上是關於理解bash腦海中發生的事情,這樣我才能把自己的想法付諸實踐。緩解。

Bash的引用似乎沒有具體說明在描述其“模式”時在特殊情況下發生的情況,並且關於SO的最接近的問題在我的情況下似乎不起作用:

$ echo "$str"
It's a complicated string
$ echo "${str//'/'\''}"
> ^C
$ echo "${str//'/'\''}"
> ^C
$ echo "${str//\'/'\''}"
> ^C
$ echo "${str//\'/\'\''}"
> ^C
$ echo "${str//\'/\'\'\'}"
It\'\'\'s a complicated string
$ echo "${str//\\'/\'\'\'}"
It's a complicated string
$ echo "${str//\\'/\\'\'\'}"
It's a complicated string
$ echo "${str//\\'/\\'\\'\'}"
It's a complicated string
$ echo "${str//\\'/\\'\\'\\'}"
It's a complicated string
$ echo "${str//\\\'/\\'\\'\\'}"
> ^C
$ echo "${str//\\\'/\\\'\\'\\'}"
It's a complicated string
$ echo "${str//\\\'/\\\'\\\'\\'}"
> ^C
$ echo "${str//\\\'/\\\'\\\'\\\'}"
It's a complicated string

> ^C行表示引號未正確解析,我被提示輸入更多內容,我每次使用Ctrl-C都無情地拒絕。)

你們中的任何一個人都會很好地解釋bash究竟是怎么看到的嗎? 我真的希望這只是我們之間的溝通問題,我有點喜歡他。 :)

編輯:

對於那些想知道的人,Etan Reisner的回答是有效的:

$ q=\'
$ echo "${str//\'/$q\'$q}"
It'\''s a complicated string

至於sputnick的回答,我更加困惑:

$ echo "${str//\047/\047\\\047\047}"
It's a complicated string
$ echo "${str//\047/\047\047}"
It's a complicated string
$ echo "${str//\'/\047\'\047}"
It\047\'\047s a complicated string
$ echo "${str//\'/\047\047\047}"
It\047\047\047s a complicated string
$ echo "${str//'/\047\047\047}"
> ^C
$ echo "${str//\047/\047\047\047}"
It's a complicated string
$ echo "${str//\047/\047\\\047\047}"
It's a complicated string

編輯2:

顯然這是一個至少影響bash 4.1和4.2並在bash 4.3中修復的bug。 因此,從上述測試中無法理解。

以下作品(帶或不帶雙引號):

echo "${str//\'/\'\\\'\'}"

每個單引號都使用反斜杠進行轉義,以防止它開始使用單引號字符串。 字面反斜杠也在替換模式中轉義。


bash 4.3會話直接復制粘貼:

$ str="It's a complicated string"
$ echo "${str//\'/\'\\\'\'}"
It'\''s a complicated string
$ echo ${str//\'/\'\\\'\'}
It'\''s a complicated string

bash 3.2中的輸出是相同的。

而不是嘗試奇怪的逃避游戲,嘗試使用單引號的ascii表示: \\047

看到

man 7 ascii

我無法解釋bash正在做什么,但與@sputnick類似,我的建議是不玩游戲。

q=\'
echo "${str//\'/$q\'$q}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM