我在bash中遇到了一个小问题。
我有这条相当丑陋的线
curl -u "$USER:$PASS" --request POST --data '{"title": "'$BRANCH_NAME'", "body": "'$DESCRIPTION'", "head": "'$OWNER':'$BRANCH_NAME'", "base": "develop"}' https://api.github.com/repos/$OWNER/$REPO_NAME/pulls
这些变量中的大多数都是单个单词,$ DESCRIPTION可能不止一个,但它似乎打破了这一行。
有没有办法让$ DESCRIPTION在它有多个单词的时候不破坏curl命令?
答案 0 :(得分:11)
使用shell here-doc ,这对(y)我们的大脑更安全:
curl \
-X POST \
-H "Content-type:text/json" \
-d@- \
"https://api.github.com/repos/$OWNER/$REPO_NAME/pulls" <<EOF
{
"title": "$BRANCH_NAME",
"body" : "$DESCRIPTION",
"head" : "$OWNER:$BRANCH_NAME",
"base" : "develop"
}
EOF
-X
开关与--request
-d
开关与--data
d@-
替换-d@/dev/stdin
。@
-d
切换表示从文件中读取 简单而恰当的解决方案=)
答案 1 :(得分:3)
您应该将变量放在“”引号内。像:
curl -u "$USER:$PASS" --request POST --data '{"title": "'"$BRANCH_NAME"'", "body": "'"$DESCRIPTION"'", "head": "'"$OWNER"':'"$BRANCH_NAME"'", "base": "develop"}' "https://api.github.com/repos/$OWNER/$REPO_NAME/pulls"
或者,您可以(甚至应该)这样做:
data="$( printf '{"title": "%s", "body": "%s", "head": "%s:%s", "base": "develop"}' "$BRANCH_NAME" "$DESCRIPTION" "$OWNER" "$BRANCH_NAME" )"
curl -u "$USER:$PASS" --request POST --data "$data" "https://api.github.com/repos/$OWNER/$REPO_NAME/pulls"
答案 2 :(得分:0)
由于$DESCRIPTION
可以是多个单词,因此必须用双引号括起来,因此:
curl -u "$USER:$PASS" --request POST \
--data '{"title": "'$BRANCH_NAME'", "body": "'"$DESCRIPTION"'", \
"head": "'$OWNER':'$BRANCH_NAME'", "base": "develop"}' \
https://api.github.com/repos/$OWNER/$REPO_NAME/pulls
这是一个不明显的小事,但"'"$DESCRIPTION"'"
部分在--data
的单引号内有双引号;那么单引号被终止(暂时),然后在"$DESCRIPTION"
附近有双引号,然后是一个新的单引号部分的开头,内部的第一个字符是双引号。
为了保持一致性和面向未来,您还应该类似地包围其他变量:
curl -u "$USER:$PASS" --request POST \
--data '{"title": "'"$BRANCH_NAME"'", "body": "'"$DESCRIPTION"'", \
"head": "'"$OWNER"':'"$BRANCH_NAME"'", "base": "develop"}' \
https://api.github.com/repos/$OWNER/$REPO_NAME/pulls
尽量避免所有shell变量值中的单引号和双引号;如果你不得不担心这样的报价,你就会做噩梦。