将变量传递给使用'EOF'的bash脚本,并将该变量视为文字。


9

在此脚本中,我最终将“ $ 1”保存到/ test文件中。

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

事实是..我需要保持

'EOF'

为'EOF',因为我的论点($ 1)包含美元符号。

但我需要保存该参数而不是保存$ 1


1
“因为我的论点($1)包含美元符号。” 如果它引用第一个命令行参数,则不是。 在执行脚本之前,已对此执行替换。 您必须在命令行上对其进行转义。
goldilocks 2014年

您已经问过有关您正在执行的任务的几个相关问题,并且问题的进展表明您并不真正了解正在发生的事情,并且可能没有选择最简单的方法。在不知道自己要做什么的情况下很难为您提供帮助,因此我建议您提出一个问题,清楚地说明您的总体任务,并且不要限制使用特定工具的答案。例如,不要说“我要使用cat并保持美元符号”,而是要说“我想修改httpd.conf来以<这种方式>更改<某些设置>”。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles,最终我决定通过python写入另一个文件,然后使用bash脚本将该文件写入已编辑的原始文件。这个过程要容易得多。cat /
temp_file

@Gilles,我的问题没有道理的原因是因为bash脚本处理传递给他们的变量的方式。有太多的事情需要逃避,但是没有即时编码和解码的功能。
user72685 2014年

@Gilles,对我来说唯一有意义的一点是base64,但是为什么必须必须对其内容进行编码才能传递到bash脚本。整个三个正斜杠以逃避反引号等。在我看来,这就像一个代码地狱
user72685 2014年

Answers:


15

跟进上一个问题,听起来您想同时将一些未解释的文本和一些已解释的文本都放入文件中。在这种情况下,请使用两个不同的cats(或echo多个s):

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

这里发生了两件事:首先,带有的heredoc语法<<。如果您在该终止符字符串中包括引号,如上面的第一个字符串一样,则整个heredoc将无法解释-没有参数且没有替代。如果您使用任何引号,例如上面的第二个 引号,cat变量like $1将被其值替换,并且命令替换将包含在文本中。您可以根据是否要替换来选择是否引用“ EOF”字符串。

为了把两个cats转换,我们使用相同的文件>> 重定向第二(以及任何更高版本)重定向:那意味着要追加到该文件。对于第一个,我们使用一个>来清除文件并重新开始。

请注意,即使替换了变量,该变量值中的任何其他美元符号也不会自行替换:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

将输出:

$bar

而不替换$bar的价值。

但是,如果要在整个脚本的参数中提供“ $”,则需要在命令行中对其进行转义或将整个内容括在单引号中。另外,如您在其他问题中所述命令替换使您可以直接将整个文件的内容放入其中,包括文件内容中的任何美元符号。确保在那里引用替换字符串:

oo.sh "$(cat myfile)"

将获得myfileas 的主体,$1然后可以根据需要catecho它。适用与答案中相同的限制:命令行参数可以使用多长时间有一个限制,并且如果您的文件可能变得更长,那么您应该找到另一种方法。您可以使用以下命令找出系统上的限制getconf ARG_MAX


1

听起来您只是想将一个变量输出到文件。在这种情况下,这将起作用:

echo $1 >/test

请注意,/test该目录位于根目录中,普通用户通常对此目录没有写权限。

编辑:请记住,您需要在命令行中引用包含美元符号的字符串。那就是替换发生的地方,脚本在事发后无法对其进行任何操作。


我认为您现在有正确的答案。+1
goldilocks

@MichaelHomer的答案更加完整,其中包含有关我遗忘的此处文档的有用信息。他的答案应该被接受(当然,除非有人发布更好的答案)。
Tom Zych 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.