【问题标题】:Bash: A multiword variable breaking curlBash:一个多字变量打破 curl
【发布时间】:2016-08-11 08:27:48
【问题描述】:

我在 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 命令?

【问题讨论】:

    标签: bash


    【解决方案1】:

    使用 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 -d 开关表示从文件中读取

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

    【讨论】:

      【解决方案2】:

      您应该将变量放在 "" 引号内。喜欢:

      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"
      

      【讨论】:

      • 我喜欢另一种选择,除了 "$(...)" 部分周围的双引号;我认为他们将对printf 论点的解释造成严重破坏。只需省略最外面的双引号。
      • 不,他们不会。省略可能是安全的,但我更喜欢总是引用。
      • 谢谢。 Bash 引用将是我的结束。我把你的第二个例子牢记在心。
      • 非常感谢,您的第一个回答对我帮助很大。
      【解决方案3】:

      由于$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变量值中同时使用单引号和双引号;如果您不得不担心此类引用,您将做噩梦。

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 1970-01-01
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多