如何处理shell脚本中的引号

时间:2014-06-04 14:27:40

标签: linux shell

this question我可以获得oracle jdk的wget网址。 我打算在脚本中使用它

wget_opts="-c --no-check-certificate --no-cookies --header --load-cookies="Cookie: oraclelicense=accept-securebackup-cookie""
jdk_download_url="http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz"

/usr/bin/wget $wget_opts $jdk_download_url

当我回显上述命令时,它显示正常并且能够正确下载文件。 但是在脚本中运行命令时,我得到以下内容

--2014-06-04 14:19:43--  http://oraclelicense=accept-securebackup-cookie%22/
Resolving oraclelicense=accept-securebackup-cookie"... failed: Name or service not known.
wget: unable to resolve host address “oraclelicense=accept-securebackup-cookie"”
--2014-06-04 14:20:03--  http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz
Resolving download.oracle.com...

Wget获取错误的网址。

我该如何纠正?

3 个答案:

答案 0 :(得分:5)

使用数组:

wget_opts=( -c 
            --no-check-certificate 
            --no-cookies 
            --header 
            --load-cookies="Cookie: oraclelicense=accept-securebackup-cookie" 
          )
jdk_download_url="http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz"

# use the exact quoting below
/usr/bin/wget "${wget_opts[@]}" "$jdk_download_url"

答案 1 :(得分:3)

试试这个:

wget_opts='-c --no-check-certificate --no-cookies --header --load-cookies="Cookie: oraclelicense=accept-securebackup-cookie"'
jdk_download_url="http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz"

/usr/bin/wget $wget_opts $jdk_download_url

检查the bash manual中单引号和双引号之间的区别。

编辑:实际上你的wget命令行有一些错误。这是正确的行。

OPTS="-c --no-check-certificate --no-cookies --header Cookie:oraclelicense=accept-securebackup-cookie"
URL="http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz"

wget $OPTS $URL

--load-cookies选项将文件作为参数而不是字符串。我们必须将--header选项与Cookie: oraclelicense=accept-securebackup-cookie一起使用。经过测试,我发现wget并不关心标题字段中的空格。所以我们可以直接使用Cookie:oraclelicense=accept-securebackup-cookie

如果您使用--debug选项,您将看到正确的格式化请求:

GET /otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz HTTP/1.1
Range: bytes=5307-
User-Agent: Wget/1.15 (linux-gnu)
Accept: */*
Host: download.oracle.com
Connection: Keep-Alive
Cookie: oraclelicense=accept-securebackup-cookie

答案 2 :(得分:2)

您需要转义其他双引号内的双引号:

wget_opts="-c --no-check-certificate --no-cookies --header --load-cookies=\"Cookie: oraclelicense=accept-securebackup-cookie\""

如果您不需要变量插值,请将字符串括在单引号中:

wget_opts='-c --no-check-certificate --no-cookies --header --load-cookies="Cookie: oraclelicense=accept-securebackup-cookie"'

此外,在您的命令中,$前面需要jdk_download_url

/usr/bin/wget $wget_opts $jdk_download_url