扩展传递给包含引号的 bash 函数的参数

扩展传递给包含引号的 bash 函数的参数

我想使用 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 变量,并且将自动扩展为字符串值。)

相关内容