在此脚本中,我最终将“ $ 1”保存到/ test文件中。
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
事实是..我需要保持
'EOF'
为'EOF',因为我的论点($ 1)包含美元符号。
但我需要保存该参数而不是保存$ 1
cat
并保持美元符号”,而是要说“我想修改httpd.conf
来以<这种方式>更改<某些设置>”。
在此脚本中,我最终将“ $ 1”保存到/ test文件中。
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
事实是..我需要保持
'EOF'
为'EOF',因为我的论点($ 1)包含美元符号。
但我需要保存该参数而不是保存$ 1
cat
并保持美元符号”,而是要说“我想修改httpd.conf
来以<这种方式>更改<某些设置>”。
Answers:
跟进上一个问题,听起来您想同时将一些未解释的文本和一些已解释的文本都放入文件中。在这种情况下,请使用两个不同的cat
s(或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”字符串。
为了把两个cat
s转换,我们使用相同的文件>>
重定向第二(以及任何更高版本)重定向:那意味着要追加到该文件。对于第一个,我们使用一个>
来清除文件并重新开始。
请注意,即使替换了变量,该变量值中的任何其他美元符号也不会自行替换:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
将输出:
$bar
而不替换$bar
的价值。
但是,如果要在整个脚本的参数中提供“ $”,则需要在命令行中对其进行转义或将整个内容括在单引号中。另外,如您在其他问题中所述,命令替换使您可以直接将整个文件的内容放入其中,包括文件内容中的任何美元符号。确保在那里引用替换字符串:
oo.sh "$(cat myfile)"
将获得myfile
as 的主体,$1
然后可以根据需要cat
或echo
它。适用与我在答案中相同的限制:命令行参数可以使用多长时间有一个限制,并且如果您的文件可能变得更长,那么您应该找到另一种方法。您可以使用以下命令找出系统上的限制getconf ARG_MAX
听起来您只是想将一个变量输出到文件。在这种情况下,这将起作用:
echo $1 >/test
请注意,/test
该目录位于根目录中,普通用户通常对此目录没有写权限。
编辑:请记住,您需要在命令行中引用包含美元符号的字符串。那就是替换发生的地方,脚本在事发后无法对其进行任何操作。
$1
)包含美元符号。” 如果它引用第一个命令行参数,则不是。 在执行脚本之前,已对此执行替换。 您必须在命令行上对其进行转义。