如何 cat <<EOF >> 包含代码的文件?

新手上路,请多包涵

我想使用 cat <<EOF >> 将代码打印到文件中:

 cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

但是当我检查文件输出时,我得到了这个:

 !/bin/bash
curr=1634
if [  -lt 4477 ]; then
   curr=406;
   echo   > /sys/class/backlight/intel_backlight/brightness;
fi

我尝试放单引号,但输出也带有单引号。我怎样才能避免这个问题?

原文由 UberNate 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 437
2 个回答

你只需要很小的改变;在 << 之后单引号这里文档分隔符。

 cat <<'EOF' >> brightup.sh

或等效的反斜杠转义它:

 cat <<\EOF >>brightup.sh

没有引用,这里的文档将进行变量替换,反引号将被评估等,就像你发现的那样。

如果您需要扩展一些(但不是全部)值,则需要单独转义要阻止的值。

 cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

会产生

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

正如 @fedorqui 所建议的,这里是来自 man bash 的相关部分:

这里的文件

这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。然后将所有读取到该点的行用作命令的标准输入。

这里文档的格式是:

       <<[-]word
              here-document
      delimiter

不对 word 执行参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则分隔符是 word 上去除引号的结果,并且 here-document 中的行不展开。 如果 word 没有被引用,则 here-document 的所有行都经过参数扩展、命令替换和算术扩展。 In the latter case, the character sequence \<newline> is ignored, and \ must be used to quote the characters \ , $ , and `

原文由 tripleee 发布,翻译遵循 CC BY-SA 4.0 许可协议

这应该可以工作,我刚刚对其进行了测试,它按预期工作:没有发生扩展、替换或你有什么。

 cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
  curr=$((curr+406));
  echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want.

使用以下方法也可以。

 cat <<< ' > file
 ... code ...'

另外,值得注意的是,当使用 heredocs 时,例如 << EOF ,会发生替换和变量扩展等。所以做这样的事情:

 cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

将始终导致变量 $HOME$PWD 的扩展。因此,如果您的主目录是 /home/foobar 并且当前路径是 /home/foobar/binfile 将如下所示:

 cd "/home/foobar"
echo "/home/foobar/bin"

而不是预期的:

 cd "$HOME"
echo "$PWD"

原文由 Alexej Magura 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题