gpt4 book ai didi

linux - 从 bash 提示符到 bash 函数 : How to escape args and quotes properly?

转载 作者:太空宇宙 更新时间:2023-11-04 09:27:01 26 4
gpt4 key购买 nike

我有一个 CouchDB 数据库,其中包含一些每日更新的状态信息。我可以使用 curl 从我的 bash 提示符查询数据库:

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

现在我想在我的 .bash_aliases 中写一个小函数 dbq 可以像这样使用:dbq mm-dd where 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 函数时,这种逃避业务让我放慢了好几次。非常感谢任何指向一些有用资源的提示和指针。)

最佳答案

我发现您需要在原始命令中传递反斜杠这一事实非常奇怪,并且有点担心这可能表明您的后端容易受到某种远程代码执行攻击。但抛开这一点:

关于 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",然后是单引号字符串直到行尾。

关于linux - 从 bash 提示符到 bash 函数 : How to escape args and quotes properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com