bash变量在字符串中间插入引号

时间:2015-04-12 02:51:01

标签: bash variables curl amazon-s3

我正在对网站进行刮擦,该网站需要身份验证才能请求一个网址,然后该网址会向我提供文件实际所在位置的签名请求。问题在于,当我尝试检索实际数据位置(签名的AWS S3 URL)时,会在字符串中随机插入引号,因此它实际上永远不会下载,因为字符串不完整。

download_url="`echo "${line}" |cut -d\] -f2-99 |tr -d '"\t'`"
curl -J -s -H "Authorization: Bearer ${token}" -D headers.tmp "${download_url}" > /dev/null
download_url="`grep "Location:" headers.tmp |cut -d\  -f2`"
curl -o "./${path}" -s -- "'"${download_url}"'"

然后我得到一个看起来像这样的命令:

curl -o './projects/abc-co/project 42/Design/Concepts/master_layouts.psd' -s --  "https://mybucket.s3.amazonaws.com/data/53a9d8b3ec9920e46f0d81daa6?AWSAccessKeyId=AKIAJ33IXO7ER3UCQ6TA&Expires=1428809754&Signature=KnImZ4%2FK%2FptJwTlZVwlV%2FktA8KQ%3D&response-content-disposition=attachment%3B"ilename%2A%3DUTF-8%27%27master_layouts.psd"

注意:" ilename 而不是文件名 我想也许这是我引用download_url的方法,但它似乎只发生在URL相当长的时候。它永远不会在第一个curl命令上失败,只有签名的S3存储桶URL。

编辑:我最初忘记了第二个代码部分中的 -s - 。 另外,如果我做一个简单的事情:

echo "${download_url}"

之后,没有插入随机引号。它只发生在实际命令中。我也尝试将它全部回显到日志中,然后通过以下方式拖尾:

tail -f log |grep -A1 curl | while read line;
do
    if [ `echo "${line}" |grep -c "^curl"` -gt 0 ]; then
        cmd="`echo -n "${line}" | cut -d\" -f1-3 | tr -d "\n" | tr '"' "'"`"
    elif [ `echo "${line}" | grep -c "^https:"` -gt 0 ]; then
        eval "${cmd}" "${line}"
    fi;
done

但这里也没有运气。

1 个答案:

答案 0 :(得分:0)

这个"答案"更多的是评论,但为了拥有易于阅读的代码,我写的是一个不完整的答案。 如果您的问题包含了从shell处理中断的任何输出的确切示例,那将会有所帮助。 (你可以加一些吗?)

的结果
 cmd_that_generates_problem_strings > problemStrings.txt
 cat problemStrings.txt

然后将您找到的内容复制/粘贴到您的问题中。使用注释行来表示问题也许有帮助,即

 outputstring"with_mismatched"_dbl-qoutes" 
 #-----------^----match------^-----------^---uh?

当然,如果嵌入了私人信息,请随意在XYZ等中对子模糊,以隐藏核心问题。

在任何情况下,我都会删除一些错误的机会,通过使用$( cmd ...)代替`cmd ...来重写这个使用现代(大约1995年)命令替换并删除你周围的dbl-quotes赋值变量值,即

download_url=$(echo "${line}" |cut -d\] -f2-99 |tr -d '"\t')
curl -J -s -H "Authorization: Bearer ${token}" -D headers.tmp "${download_url}" > /dev/null
download_url=$(grep "Location:" headers.tmp |cut -d\  -f2)
curl -o "./${path}" -s -- "${download_url}"

其他一些事情在这段代码中没有响,即

|cut -d\] -f2-99 

由']'分隔的字段char,从2到99?这似乎是一个广泛的文件与令人难以置信的包围。同样,使用真实的样本数据,它将更容易提供帮助。

tr -d '"\t'

删除所有dbl-quotes和tab chars?也许这与您获得的错误有关,因为在dbl-quotes中将赋值包装到download_url,并且正在抛弃cmd-line解析器。 (对不起,我没有耐心为此构建测试)

再次向我们展示一些您正在使用的未经处理的网址,也许我们可以提供帮助。

祝你好运!