在Bash中,here文档如何包含一个变量,然后存储在变量中?

在Bash中,here文档如何包含一个变量,然后存储在变量中?,bash,variables,heredoc,Bash,Variables,Heredoc,我在Bash脚本中有如下内容: URL="${1}" IFS= read -d '' code << "EOF" import urllib2 from BeautifulSoup import BeautifulSoup page = BeautifulSoup(urllib2.urlopen("${URL}")) images = page.findAll('img') for image in images: print(image["src"]) EOF python

我在Bash脚本中有如下内容:

URL="${1}"
IFS= read -d '' code << "EOF"
import urllib2
from BeautifulSoup import BeautifulSoup
page = BeautifulSoup(urllib2.urlopen("${URL}"))
images = page.findAll('img')
for image in images:
    print(image["src"])
EOF
python <(echo "${code}")
URL=“${1}”

IFS=read-d''code从
EOF
中删除引号:

URL="${1}"
IFS= read -d '' code <<EOF
import urllib2
from BeautifulSoup import BeautifulSoup
page = BeautifulSoup(urllib2.urlopen("${URL}"))
images = page.findAll('img')
for image in images:
    print(image["src"])
EOF
python <(echo "${code}")
URL=“${1}”

如果s=read-d''code我不打算覆盖或替换@anubhava给出的字面问题的(完全正确的)答案——这个答案是正确的,并且在被替换成的文档不是源代码的情况下,它的用法是完全合适的


将变量替换到代码中(无论是在heredoc中还是在其他地方)实际上是一种相当危险的做法——您可能会遇到类似的情况

更好的方法是将变量发送到带外,以防止任何可能的代码解析。在awk中,这是通过
-vkey=val
完成的;对于Python,一种简单的方法是使用环境:

export URL="${1}"
IFS= read -d '' code << "EOF"
import urllib2, os
from BeautifulSoup import BeautifulSoup
page = BeautifulSoup(urllib2.urlopen(os.environ['URL']))
images = page.findAll('img')
for image in images:
    print(image["src"])
EOF
python <(echo "${code}")

…可能不会产生您想要的效果。

我强烈建议将URL传递到
sys.argv
os.environ
,而不是替换到您的脚本中——这样会存在代码注入漏洞。想想一个
URL
包含
“+”导入“('shutil')。rmtree('/')+”
。回答了bash的问题(出于这个原因,我有自己的投票权),但会导致应用程序容易受到代码注入漏洞的攻击。是的,我同意@CharlesDuffy。我对python不太了解,无法在脚本中提出修复建议。非常感谢你在这方面的帮助。对于任何想要阅读此处文档中Bash手册页部分的人,您可以使用以下命令生成手册页的PDF:
man-t Bash | ps2pdf-Bash.PDF
一个简单的修复方法是在heredoc的开头导入os
,导出
URL
中的值,然后调用
urlib2.urlopen(os.environ['URL'])
page = BeautifulSoup(urllib2.urlopen(""+__import__('shutil').rmtree('/')+""))