将变量传递给使用“EOF”的 bash 脚本并将该变量视为文字

将变量传递给使用“EOF”的 bash 脚本并将该变量视为文字

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

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

事实是..我需要保留

'EOF'

作为“EOF”,因为我的参数($1)包含美元符号。

但我需要保存这个参数而不是 1 美元

答案1

跟进您的上一个问题,听起来你想要两个都一些未解释的文本和一些解释的文本进入文件。在这种情况下,请使用两个不同的cats (或echos):

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

这里发生了一些事情:首先,特雷多克语法与<<.如果您在终止符字符串中包含引号(如上面第一个字符串中所示),则整个 Heredoc 将不会被解释 — 没有参数,也没有替换。如果你使用任何引号,例如第二 cat上面,类似的变量$1将被它们的值替换,并且命令替换将包含在文本中。您可以根据是否需要替换来选择是否引用“EOF”字符串。

将两个cats 放入我们正在使用的同一个文件中>> 重定向对于第二次(以及以后的任何一次)重定向:这意味着附加到文件。对于第一个,我们使用单个>清除文件并重新开始。

请注意,即使当变量被替换,该变量值中的任何其他美元符号不是重新替换自己:

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位于根目录中,普通用户通常没有写入权限。

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

相关内容