嘿,我正在使用管道卷曲方法从帖子创建任务。当我从带有硬编码值的终端运行时,它工作正常。但是当我尝试使用变量执行它时,它会抛出错误:
脚本:
#!/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
答案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 post
、for "testing"
、open
、high
和ahsan
,此代码将生成与以下文档等效的 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"
}
]
}
请注意,双引号均已正确处理。