无法解析curl命令中的bash变量

无法解析curl命令中的bash变量

嘿,我正在使用管道卷曲方法从帖子创建任务。当我从带有硬编码值的终端运行时,它工作正常。但是当我尝试使用变量执行它时,它会抛出错误:

脚本:

#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"
echo "$5"
echo '{
  "transactions": [
    {
      "type": "title",
      "value": "$1"
    },
    {
      "type": "description",
      "value": "$2"
    },
    {
      "type": "status",
      "value": "$3"
    },
    {
      "type": "priority",
      "value": "$4"
    },
    {
       "type": "owner",
       "value": "$5"
    }
  ]
}' | arc call-conduit --conduit-uri https://mydomain.phacility.com/ --conduit-token mytoken maniphest.edit

执行:

./test.sh "test003 ticket from api post" "for testing" "open" "high" "ahsan"

输出:

test003 ticket from api post
for testing
open
high
ahsan
{"error":"ERR-CONDUIT-CORE","errorMessage":"ERR-CONDUIT-CORE: Validation errors:\n  - User \"$5\" is not a valid user.\n  - Task priority \"$4\" is not a valid task priority. Use a priority keyword to choose a task priority: unbreak, very, high, kinda, triage, normal, low, wish.","response":null}

正如您在错误中看到的那样,它将 $4 和 $5 读取为值而不是变量。我无法理解如何使用 $variables 作为这些参数的输入。

答案1

这里的问题是您使用的是单引号。它可以防止 shell 进行变量扩展。请改用双引号(并转义内部双引号)或在变量 $X 周围添加额外的单引号。

例如比较这个命令:

$ test_var="wiii" && echo '"$test_var"'
"$test_var"

和这个:

$ test_var="wiiii" && echo "\"$test_var\""
"wiiii"

和这个:

$ test_var="wiiii" && echo '"'$test_var'"'
"wiiii"

需要阅读的附加信息:

答案2

您的主要问题是 shell 不会扩展单引号内的变量。您还存在将未经处理的用户提供的数据直接注入 JSON 文档而不对其进行编码的问题。

我们可以通过让jq对用户提供的数据进行编码:

#!/bin/sh

if [ "$#" -ne 5 ]; then
    printf 'Expected 5 arguments, got %d\n' "$#" >&2
    exit 1
fi

for type in title description status priority owner
do
        jq -n --arg type "$type" --arg value "$1" '{ type: $type, value: $value }'
        shift
done | jq -c -s '{ transactions: . }' |
arc call-conduit \
        --conduit-uri 'https://mydomain.phacility.com/' \
        --conduit-token 'mytoken' \
        maniphest.edit

该脚本采用命令行参数,并transactions通过创建jq包含 atype和 avalue键且具有适当内容的对象来创建数组元素。

transactions然后,通过另一个jq调用(从循环中读取)将生成的对象插入到数组中。这将创建最终的 JSON 文档,然后将其传递给arc命令。

而不是看起来稍长且复杂的

jq -n --arg type "$type" --arg value "$1" '{ type: $type, value: $value }'

在循环体中,您可以使用工具jo像这样:

jo type="$type" value="$1"

jo调用和原始jq调用都将确保$type(我们的循环变量)和$1(用户提供的命令行参数)都经过正确的 JSON 编码。

给定五个参数"test003" ticket from api postfor "testing"openhighahsan,此代码将生成与以下文档等效的 JSON 文档,并将其传递给arc

{
  "transaction": [
    {
      "type": "title",
      "value": "\"test003\" ticket from api post"
    },
    {
      "type": "description",
      "value": "for \"testing\""
    },
    {
      "type": "status",
      "value": "open"
    },
    {
      "type": "priority",
      "value": "high"
    },
    {
      "type": "owner",
      "value": "ahsan"
    }
  ]
}

请注意,双引号均已正确处理。

相关内容