【问题标题】:Professionals Can Do It Bash + Escape专业人士可以做到 Bash + Escape
【发布时间】:2011-08-02 12:16:12
【问题描述】:

我花了一整夜试图完成这个过程,但我所有的尝试都以失败告终。

我编写了一个非常简单的脚本来清除我正在尝试做的事情,请复制它并尝试启动它。

    #!/bin/bash
set -x
urls='http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3'
#urls="http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3"


for letsgo in `curl -OLJg  "'${urls}'"` ; do
echo "GOT TRIED OF TRYING"
done

# for letsgo in `curl -OLJg $urls` ; do
#echo "GOT TRIED OF TRYING"
# done

我启动后得到的结果

第一个循环方式:-

./ap2.sh
+ urls='http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3'
++ curl -OLJg ''\''http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3'\'''

curl: (1) Protocol 'http not supported or disabled in libcurl
+ for letsgo in '`curl -OLJg  "'\''${urls}'\''"`'
+ echo 'GOT TRIED OF TRYING'
GOT TRIED OF TRYING

第二次循环

./ap2.sh
+ urls='http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3'
++ curl -OLJg http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine '(Original' 'Mix).mp3'
curl: option -: is unknown
curl: try 'curl --help' or 'curl --manual' for more information

问题是我不知道在未经我许可的情况下转义 url 并让事情无法正常工作。

更新

我通过使用摆脱它

for letsgo in `curl -OLJg  "${urls}"` ; do
echo "Working Fine But We Still Have Problem When We Are Using More Than 1 URL"
done

脚本有多个 url 时的问题,每个 url 必须用引号引起来(仅适用于我的情况)才能使 curl 可能正常工作。我可以在 linux 控制台中手动完成,没有任何问题,但是在使用 BASH 脚本时,这些脚本的结果将是

#!/bin/bash
set -x
urls="'http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3' -OLJg 'http://webprod15.megashares.com/index.php?d01=3109985&lccdl=9e8e091ef33dd103&d01go=1' -OLJg "



for letsgo in `curl -OLJg "${urls}"` ; do
    echo "Working Fine But We Still Have Problem When We Are Using More Than 1 URL"
done

结果:-

+ urls=''\''http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3'\'' -OLJg '\''http://webprod15.megashares.com/index.php?d01=3109985&lccdl=9e8e091ef33dd103&d01go=1'\'' '
++ curl -OLJg ''\''http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3'\'' -OLJg '\''http://webprod15.megashares.com/index.php?d01=3109985&lccdl=9e8e091ef33dd103&d01go=1'\'' '

curl: (1) Protocol 'http not supported or disabled in libcurl
+ for letsgo in '`curl -OLJg "${urls}"`'
+ echo 'Working Fine But We Still Have Problem When We Are Using More Than 1 URL'
Working Fine But We Still Have Problem When We Are Using More Than 1 URL

我只是希望它以与在 linux 控制台上输入它相同的方式正常工作,而不会受到 bash 通过转义字符串造成的中断。像这样

curl -OLJg 'http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3' -OLJg 'http://webprod15.megashares.com/index.php?d01=3109985&lccdl=9e8e091ef33dd103&d01go=1' -OLJ

【问题讨论】:

  • 不要使用"',因为这样' 将作为字符串传递
  • @knittl @all 能否请您在更新后查看问题。
  • 要正确地转义使用 printf (stackoverflow.com/questions/5608112/…)
  • @sehe 这无济于事,因为 shell 在 printf 转义后再次对其进行转义。

标签: linux bash unix escaping


【解决方案1】:

您应该删除 curl 参数中的单引号 - 您编写它的方式它们成为 URL 的一部分。

【讨论】:

  • 如果我删除它,$urls 变量将无法自行定义。
  • @M.A.G:我不是在谈论作业的界限,没关系。这是您在调用curl 时使用的单引号。
  • 它不是单引号,而是一个反引号,它已被弃用,因为它们很容易与单引号混淆,并且不容易嵌套,如现代 $(foo $(bar $(baz)))
  • @unknown:我知道单引号和反引号的区别,原代码包含两个不应该出现的单引号。
  • @Buyukliev 请你再看一遍。
【解决方案2】:

您是否曾在浏览器地址栏中看到空白?它们必须转换为 %A20 (由 Lucas 的评论更正,谢谢) %20,也许还有类似的特殊字符。

wellurl=$(echo $urls | sed 's/ /%20/g')

我不知道 curl - 它类似于 wget,不是吗?

wget -np $wellurl
2011-04-10 16:55:28 (17,2 MB/s) - »An-Beat - Mentally Insine (Original Mix).mp3« gespeichert [191]

为我工作。

更新:

要从脚本中获取多个 url,请使用数组:

#!/bin/bash
#
declare -a urls
urls=('http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3' 'http://webprod15.megashares.com/index.php?d01=3109985&lccdl=9e8e091ef33dd103&d01go=1')

for i in $(seq 0 ${#urls[@]} )
do 
    wellurl=$(echo ${urls[i]} | sed 's/ /%20/g')
    # echo "$wellurl"
    curl -OLJg "$wellurl"
done
  • ${#urls[@]} 返回数组中的元素个数
  • 不要将选项放入数组中
  • 请在您的下一个问题中使用较小的网址 :)

【讨论】:

  • 只是%20。 ;) 有些服务器会允许空格,但这确实违反了标准。如果需要像这样对任意 URL 进行转义,这可能是 bash 的一个挑战(请参阅stackoverflow.com/questions/296536/urlencode-from-a-bash-script)。
  • @user unknown 可以请再次查看我的问题。
  • @M.A.G 如果您再次查看我的答案,是的。
  • @user 未知。无论如何,你能帮我把它带到我正在做的同样的方式工作吗?我写了任何主题以进一步清除它。 stackoverflow.com/questions/5624687/… ...我真的在寻求您的帮助
  • bash 调用php,并使用结果,还是从php 调用bash?我看不出这里是如何涉及 php 的。你必须表明是什么造成了问题。它不够具体。 php如何生成url?为什么不使用php来抓取网站,或者你为什么完全使用php?
【解决方案3】:

试试这个

urls="http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3"
curl -OLJg  "${urls}" | while read results
do
 ...
done

【讨论】:

    【解决方案4】:
    【解决方案5】:

    使用名为 urls 的变量表明其中会有多个 URL。如果是这样,您可能会考虑使用 BASH 数组。此外,回显消息“GOT TIRED OF WAITING”表明 curl 可能会失败。如果是这样,您可能会考虑更明确地检查错误。

    检查并尝试运行以下命令:

    set -x
    list_of_urls=('http://bellatrix.oron.com/jrmxp36wf36yew4veg4fp53kmwlogjeecmopy3n2ja5yqkyzekxwqx2pckq6dtd5hb7duvgk/An-Beat - Mentally Insine (Original Mix).mp3')
    
    for url in "${list_of_urls[@]}"
    do
     curl -s -OLJg  "${url}"
     if [ $? -gt 0 ]; then
       echo "$url is a PROBLEM! (return code: $?)" 
     fi
    done
    

    在运行它时我注意到一件事:服务器“成功”(换句话说,$? 等于 0),但 curl 返回了一个名为 error.html 的文件。这可能是您捕获的另一个错误情况。祝你好运!

    【讨论】:

    • 你不能像这样使用$? 两次:第二次的值为0,[ $? -gt 0] 的返回值。如果您想多次使用它,则必须将$? 保存在一个变量中。
    • @M.A.G:我看到了你的问题的更新。您将希望 CURL 处理的所有 URL 传递到一个 CURL 命令中。恐怕您必须组装命令行以在每个 URL 之前包含“-OLJg”。我认为这种方式“不理想”,使用数组会是更好的方法。尝试“用户未知”或我提供的脚本(但提供警告 glenn jackman)。祝你好运!
    【解决方案6】:

    curl -K 对你没有帮助吗? (您可以将网址完全按照您在导航栏中看到的方式放入文件中) http://curl.haxx.se/docs/manpage.html

    【讨论】:

    • 感谢您的帮助。我试图阅读手册页,但我不知道如何使用 curl -K。我在互联网上搜索但没有找到。我希望你能解释一下我如何在我的情况下使用它。
    • 据我所知,您想下载一些网址。制作一个文件让我们说带有内容的网址: url = link/1.txt -O url = link/2.txt -O url = link/3.txt -O url = link/4.txt -O 使用 curl -K urls 将下载所有文件及其名称;或者,您可以使用 wget -i urls_file ,其中 urls 文件可以是没有任何其他规范的简单 url 列表。
    • 这个网站的烂编辑!!!第一行是 url = link,第二行是 -O
    • 那个-O也可以是你的-OLJg
    猜你喜欢
    • 2012-12-14
    • 2011-03-22
    • 2010-11-27
    • 2013-02-24
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2015-12-31
    • 2018-12-23
    相关资源
    最近更新 更多