1

我在 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 命令中包含多个单词时不会破坏它?

4

3 回答 3

11

使用 here-doc对(你)我们的大脑来说会更安全:

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
  • @for -dswitch 表示从文件中读取

简单而正确的解决方案=)

于 2013-02-13T22:04:23.990 回答
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"
于 2013-02-13T21:46:33.953 回答
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 变量值中同时使用单引号和双引号;如果您不得不担心这样的报价,您将做噩梦。

于 2013-02-13T21:47:15.713 回答