在此脚本中,我最终将“$1”保存到 /test 文件中。
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
事实是..我需要保留
'EOF'
作为“EOF”,因为我的参数($1)包含美元符号。
但我需要保存这个参数而不是 1 美元
答案1
跟进您的上一个问题,听起来你想要两个都一些未解释的文本和一些解释的文本进入文件。在这种情况下,请使用两个不同的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 将不会被解释 — 没有参数,也没有替换。如果你不使用任何引号,例如第二 cat
上面,类似的变量$1
将被它们的值替换,并且命令替换将包含在文本中。您可以根据是否需要替换来选择是否引用“EOF”字符串。
将两个cat
s 放入我们正在使用的同一个文件中>>
重定向对于第二次(以及以后的任何一次)重定向:这意味着附加到文件。对于第一个,我们使用单个>
清除文件并重新开始。
请注意,即使当变量被替换,该变量值中的任何其他美元符号不是重新替换自己:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
将输出:
$bar
无需替换$bar
的值。
但是,如果您在整个脚本的参数中提供“$”,则需要在命令行上对其进行转义或将整个内容用单引号引起来。或者,命令替换如你的另一个问题允许您直接放入整个文件的内容,包括文件内容中的任何美元符号。确保在那里引用替换字符串:
oo.sh "$(cat myfile)"
myfile
将得到as的主体$1
,然后可以根据需要cat
或it 。echo
与中相同的限制我的回答在那里apply:命令行参数的长度是有限制的,如果你的文件可能比这个长,你应该找到另一种方法。您可以使用以下命令了解您的系统的限制getconf ARG_MAX
答案2
听起来你只是想将一个变量输出到文件。在这种情况下,这将起作用:
echo $1 >/test
请注意,它/test
位于根目录中,普通用户通常没有写入权限。
编辑:请记住,您需要引用包含美元符号的字符串在命令行中。这就是替换发生的地方,并且脚本在事后无法对其执行任何操作。