Bash和curl脚本问题

Bash和curl脚本问题,bash,curl,Bash,Curl,我试图在bash脚本中包含此curl命令(到Dropbox audit api): curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXX' --header 'Content-Type: application/json' --data '{"time":{"start_time":"2018-07-16T18:07:

我试图在bash脚本中包含此curl命令(到Dropbox audit api):

curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXX' --header 'Content-Type: application/json' --data '{"time":{"start_time":"2018-07-16T18:07:56Z"}}'
我已经用XXXXX等替换了身份验证令牌

在我的脚本中,时间戳实际上是一个名为$LAST的变量

我按照如下方式构建curl命令:

LAST=$(date +"%Y-%m-%dT%H:%m:%SZ")

DROPBOX1=$(echo 'curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header '\''Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXX'\'' --header '\''Content-Type: application/json'\'' --data '\''{"time":{"start_time":"')

DROPBOX2=$(echo '"}}'\''')

CURLSTRING=$DROPBOX1$LAST$DROPBOX2

echo $CURLSTRING
$CURLSTRING 
我以这种方式构建它,否则$LAST是有问题的,因为curl帖子中有所有的单引号和双引号

运行该小脚本可获得以下输出:

curl -X POST https://api.dropboxapi.com/2/team_log/get_events --header 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXX' --header 'Content-Type: application/json' --data '{"time":{"start_time":"2018-07-16T18:07:56Z"}}'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
100   175    0   127  100    48    232     87 --:--:-- --:--:-- --:--:--   231
curl: (6) Could not resolve host: Bearer
curl: (6) Could not resolve host: XXXXXXXXXXXXXXXXXXXXXXXXX'
curl: (6) Could not resolve host: application
正如可以看到的那样,脚本中的echo命令显示了一个看起来完全有效的curl命令——事实上,如果我剪切并通过该输出到命令行,它就会工作。但是,正如bash脚本本身的其余输出所示,curl命令没有得到正确的解释

我一辈子都搞不懂为什么会这样。显然,echo正确地保留了字符串,而curl命令以某种方式分解了$CURLSTRING。很明显,我没有正确地使用单引号和双引号的组合,但确切地说,在什么地方出现了中断还不清楚

谢谢


Rob

您不能安全地将任意列表(如命令行参数列表——每个参数都是一个单独的字符串)存储在字符串变量中(本质上只存储一个字符串)。使用一个数组,如……中所示,也就是说——这根本不是特定于curl的;任何变量的无引号扩展都会执行字符串拆分和全局扩展,但如果该变量中包含的引号是语法性的,则不会对其进行解析。这是必要的——如果bash中的不可信数据可能包含任意语法,那么就不可能编写安全处理这些数据的代码。顺便说一句,
foo=$(echo'bar')
是一种非常低效的编写
foo='bar'
的方法。即使命令替换没有生成外部进程,也要花费数毫秒才能运行--您正在
fork()
生成子shell并捕获其输出。对于
get\u事件
,您确定必须执行POST吗。可能是因为您正在传递数据
-d{…}
。在脚本中运行整个命令,并通过
bash-xyourscript.sh运行脚本,看看它将如何扩展变量