簡體   English   中英

從bash提示到bash函數:如何正確轉義args和引號?

[英]From bash prompt to a bash function: How to escape args and quotes properly?

我有一個CouchDB數據庫,其中包含一些每日更新的狀態信息。 我可以使用curl在bash提示符下查詢數據庫:

curl 'http://localhost:5984/db/_design/state/_view/stateinfo?group=true&startkey=\["2016-02-10",0\]&endkey=\["2016-02-10\u9999",\{\}\]'

現在,我想要寫一個小功能dbq.bash_aliases可以像這樣使用: dbq mm-dd ,其中mm-dd是這樣一個日期02-10 我嘗試了(以及其他變體):

dlq() { curl  \'http://localhost:5984/db/_design/state/_view/stateinfo?group=true\&startkey=\[2016-{$1},0\]\&endkey=\[2016-{$1}\u9999,\{\}\] \' ;}

我只是無法在bash函數中獲得參數插值( $1 )和方括號,引號,斜杠和與號的轉義。 關於如何正確執行此操作的任何想法? (順便說一句,當從有效的bash提示解決方案過渡到帶有參數的可重用bash函數時,這種轉義的業務使我的速度降低了數倍。對任何有用資源的提示和指示都深表感謝。)

函數的主體被有效地加上了引號(原因是它們優於別名),因此您無需轉義單引號或其中的任何內容。 但是,您確實需要使用雙引號使$1擴展。

就像是...

dlq() {
    baseurl="http://localhost:5984/db/_design/state/_view/stateinfo"
    curl "$baseurl?group=true&startkey=[2016-{$1},0\]&endkey=[2016-{$1}\u9999,{}]"
}

(請仔細檢查參數;我不確定錯誤地轉義了哪些內容以及可能需要轉義該API的內容。)

我發現您需要在原始命令中傳遞反斜杠的事實很奇怪,並且有點擔心,這可能表明您的后端容易受到某種遠程代碼執行攻擊。 但撇開這一點:

關於bash引號要記住的事情是,圍繞'的規則非常簡短,但是又是如此簡短以至於常常使人們感到驚訝。 具體來說,規則是這樣的:在下一個'標記之前,絕對沒有什么特別的。 沒有。 沒有反斜杠,沒有換行符,沒什么。 一切都通過了。

這與大多數使人絆倒的編程語言不同。

在原始命令行中,當您傳遞此命令時:

curl 'http://localhost:5984/db/_design/state/_view/stateinfo?group=true&startkey=\["2016-02-10",0\]&endkey=\["2016-02-10\u9999",\{\}\]'

這意味着curl的參數實際上是

http://localhost:5984/db/_design/state/_view/stateinfo?group=true&startkey=\["2016-02-10",0\]&endkey=\["2016-02-10\u9999",\{\}\]

保留所有反斜杠。

現在,在函數中,傳遞所需內容的最簡單方法是使用bash中兩個相鄰字符串作為單個參數傳遞在一起的事實,然后執行以下操作:

dlq() {
  curl  'http://localhost:5984/db/_design/state/_view/stateinfo?group=true&startkey=\["2016-'"$1"'",0\]&endkey=\["2016-'"$2"'\u9999",\{\}\]'
}

請注意,我在單引號中有一個以"2016-結尾的字符串,然后在雙引號中是"$1"的字符串,然后是以雙引號字符開頭並一直持續到它也結束的單引號字符串在"2016- ,然后雙引號"$2" ,然后是單引號的字符串,直到行尾。

暫無
暫無

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

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