我想使用 json 主体执行此 curl 命令。我希望能够借助 bash 函数(例如“query_db myId myClass”)来执行它
function query_db(){
curl -x socks5h://localhost:30001 -X POST https://my-db.us-east-1.es.amazonaws.com/my_db/_search?pretty -H 'Content-Type: application/json' -d '{
"query": {
"bool": {
"must": [
{ "match": { "eventData.clazz": "'$2'" }},
{ "match": { "eventData.itemId": "'$1'" }}
]
}
}
}'
}
但是,上述查询失败,因为 $2 和 $1 没有扩展为实际参数。我该如何修复这个函数?
答案1
它确实有效。不过,如果参数包含空格,它就会中断(如果参数包含 JSON 中的特殊字符,它也会以不同的方式中断),但的一般用法'text'$var'text'
是正确的。
为了修复空格问题,请在每个变量扩展周围加上双引号:(现有的双引号只是单引号字符串文字内的文字字符,因此它们对变量扩展没有任何作用)
' ...
{ "match": { "eventData.clazz": "'"$2"'" }},
{ "match": { "eventData.itemId": "'"$1"'" }}
... '
但适当地解决所有问题,您需要使用一些真正了解如何生成 JSON 的工具,而不仅仅是通用的字符串替换:
function query_db(){
local json="$(jq --null-input --arg class "$2" --arg item "$1" '{
"query": {
"bool": {
"must": [
{ "match": { "eventData.clazz": $class } },
{ "match": { "eventData.itemId": $item } }
]
}
}
}')"
curl -x socks5h://localhost:30001 -X POST https://my-db.us-east-1.es.amazonaws.com/my_db/_search?pretty -H 'Content-Type: application/json' -d "$json"
}
($class
和$item
现在是 jq 变量,而不是 bash 变量,并且将自动扩展为字符串值。)