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

use*_*685 10 bash shell-script cat here-document

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

#!/bin/bash
cat > /test << 'EOF'
$1
EOF
Run Code Online (Sandbox Code Playgroud)

事实是..我需要保持

'EOF'
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*mer 17

跟进您之前的问题,听起来您希望将一些未解释的文本和一些已解释的文本放入文件中。在这种情况下,使用两个不同的cats(或echos):

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

有几件事情会在这里:首先,定界符语法<<。如果您在该终止符字符串中包含引号,就像上面的第一个一样,整个 heredoc 都不会被解释——没有参数也没有替换。如果你不使用任何引号,就像上面的第二个 cat一样,变量 like$1将被它们的值替换,命令替换将包含在文本中。您可以根据是否需要替换来选择是否引用“EOF”字符串。

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

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

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
Run Code Online (Sandbox Code Playgroud)

将输出:

$bar
Run Code Online (Sandbox Code Playgroud)

不替换 in$bar的值。

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

oo.sh "$(cat myfile)"
Run Code Online (Sandbox Code Playgroud)

将获得myfileas的主体,$1然后可以根据需要cat或echo它。与我的回答相同的限制适用:命令行参数的长度有限制,如果您的文件可能比这更长,您应该找到另一种方法。您可以通过以下方式找出系统上的限制getconf ARG_MAX


Tom*_*ych 1

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

echo $1 >/test
Run Code Online (Sandbox Code Playgroud)

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

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