指挥大楼及;Bash中的字符串转义

指挥大楼及;Bash中的字符串转义,bash,shell,curl,escaping,Bash,Shell,Curl,Escaping,我正在尝试构建一个Bash脚本,该脚本将从命令行获取参数以及硬编码参数,并将它们传递给一个函数,该函数反过来将构造对curl的调用并执行httppost。不幸的是,当我尝试传递带有空格的字符串时,脚本会破坏字符串,最终对curl的调用无法按正确的顺序传递参数: #!/bin/bash API_URL="http://httpbin.org/" docurl() { arg1=$1 shift arg2=$1 shift args=() whi

我正在尝试构建一个Bash脚本,该脚本将从命令行获取参数以及硬编码参数,并将它们传递给一个函数,该函数反过来将构造对curl的调用并执行httppost。不幸的是,当我尝试传递带有空格的字符串时,脚本会破坏字符串,最终对curl的调用无法按正确的顺序传递参数:

#!/bin/bash

API_URL="http://httpbin.org/"

docurl() {
    arg1=$1
    shift
    arg2=$1
    shift

    args=()
    while [ "$1" ]
    do
        arg_name="$1"
        shift
        arg_value="$1"
        shift

        args+=(-d $arg_name="$arg_value")
    done

    curl_result=$( curl -qSfs "$API_URL/post" -X POST -d arg1=$arg1 -d arg2=$arg2 ${args[@]} ) 2>/dev/null
    echo "$curl_result"
}

docurl foo1 foo2 title "$1" body "$2"
脚本调用如下所示:

test2.sh "Hello" "Body of the message"
当前脚本的输出如下所示:

{
  "form": {
    "body": "Body",
    "arg1": "foo1",
    "arg2": "foo2",
    "title": "Hello"
  },
  "headers": {
    "Host": "httpbin.org",
    "Connection": "close",
    "Content-Length": "41",
    "User-Agent": "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3",
    "Content-Type": "application/x-www-form-urlencoded",
    "Accept": "*/*"
  },
  "files": {},
  "data": "",
  "url": "http://httpbin.org/post",
  "args": {},
  "origin": "xxx.xxx.xxx.xxx",
  "json": null
}
如您所见,在
表单
元素中,“body”和“title”字段被截断。有人能告诉我我做错了什么吗?

多引用一点

    args+=(-d "$arg_name"="$arg_value")
以及:

多引用一点

    args+=(-d "$arg_name"="$arg_value")
以及:


美好的这可能会使编写
args+=(-d“$arg\u name=$arg\u value”)
(作为一个整体,
$arg\u name=$arg\u value
周围的双引号)-添加到数组分配有效地添加了2个元素;这可能会使编写
args+=(-d“$arg\u name=$arg\u value”)
时发生的事情更加清楚(在
$arg\u name=$arg\u value
周围加上双引号作为一个整体)-添加到数组分配有效地添加了2个元素。