Bash:打破卷曲的多字变量

时间:2013-02-13 21:36:13

标签: bash

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

3 个答案:

答案 0 :(得分:11)

使用 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变量值中的单引号和双引号;如果你不得不担心这样的报价,你就会做噩梦。