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
听起来您只是想将一个变量输出到文件中。在这种情况下,这将起作用:
echo $1 >/test
Run Code Online (Sandbox Code Playgroud)
请注意,它/test位于根目录中,普通用户通常没有写入权限。
编辑:请记住,您需要在命令行中引用包含美元符号的字符串。这就是替换发生的地方,并且脚本在事后无法对其执行任何操作。
| 归档时间: |
|
| 查看次数: |
45094 次 |
| 最近记录: |