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

2024-09-30 15:23:00
admin
原创
119
摘要:问题描述:我想使用以下方法将代码打印到文件中cat &lt;&lt;EOF >>:cat &lt;&lt;EOF >> brightup.sh !/bin/bash curr=`cat /sys/class/backlight/intel_backlig...

问题描述:

我想使用以下方法将代码打印到文件中cat &lt;&lt;EOF >>

cat &lt;&lt;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

我尝试添加单引号,但输出中也带有单引号。我该如何避免此问题?


解决方案 1:

您只需要进行最小的更改;在 之后用单引号括住此处的文档分隔符&lt;&lt;

cat &lt;&lt;&#039;EOF&#039; >> brightup.sh

或者等效地使用反斜杠转义:

cat &lt;&lt;EOF >>brightup.sh

如果不引用,此处的文档将经历变量替换、反引号将被评估等,就像您所发现的那样。

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

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

将产生

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

根据@fedorqui的建议,以下是相关部分man bash

此处有文件

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

here-documents 的格式为:

      &lt;&lt;[-]word
              here-document
      delimiter

不对 word 执行任何参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则分隔符是 word 上引号删除的结果,并且不会扩展此处文档中的行。 如果 word 未被引用,则此处文档的所有行都将受到参数扩展、命令替换和算术扩展。在后一种情况下,字符序列&lt;newline>将被忽略,并且 ``
必须用来引用字符、`$`和`。

对于相关问题,另请参阅<https://stackoverflow.com/a/54434993>

解决方案 2:

这应该可行,我刚刚测试了一下并且它按预期工作:没有发生扩展、替换或其他事情。

cat &lt;&lt;&lt; &#039;
#!/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&#039; > file # use overwrite mode so that you don&#039;t keep on appending the same script to that file over and over again, unless that&#039;s what you want. 

使用以下方法也有效。

cat &lt;&lt;&lt; &#039; > file
 ... code ...&#039;

另外,值得注意的是,当使用 heredocs 时,例如&lt;&lt; EOF,会发生替换和变量扩展等。因此,请执行以下操作:

cat &lt;&lt; EOF > file
cd &quot;$HOME&quot;
echo &quot;$PWD&quot; # echo the current path
EOF

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

cd &quot;/home/foobar&quot;
echo &quot;/home/foobar/bin&quot;

而不是预期的:

cd &quot;$HOME&quot;
echo &quot;$PWD&quot;

解决方案 3:

或者,使用 EOF 标记,您需要引用初始标记,这样就不会进行扩展:

#-----v---v------
cat &lt;&lt;&#039;EOF&#039; >> 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

解决方案 4:

我知道这是一个两年前的问题,但对于那些寻找“如何做”的人来说,这是一个快速的答案。

如果您不想在任何内容周围加上引号,您可以简单地将一个文本块写入文件,并转义您想要导出为文本的变量(例如用于脚本),而不是转义您想要导出为变量值的变量。

#!/bin/bash

FILE_NAME=&quot;test.txt&quot;
VAR_EXAMPLE=&quot;\&quot;string\&quot;&quot;

cat > ${FILE_NAME} &lt;&lt; EOF
${VAR_EXAMPLE}=${VAR_EXAMPLE} in ${FILE_NAME}  
EOF

会将 '"${VAR_EXAMPLE}="string" in test.txt' 写入 test.txt

这也可以用来通过省略文件名以相同的规则将文本块输出到控制台

#!/bin/bash

VAR_EXAMPLE=&quot;\&quot;string\&quot;&quot;

cat &lt;&lt; EOF
${VAR_EXAMPLE}=${VAR_EXAMPLE} to console 
EOF

将输出“”${VAR_EXAMPLE} =“string”到控制台”

解决方案 5:

cat with&lt;&lt;EOF>>将创建或附加内容到现有文件,不会覆盖。而 cat with&lt;&lt;EOF>将创建或覆盖内容。

cat test.txt 
hello

cat &lt;&lt;EOF>> test.txt
> hi
> EOF

cat test.txt 
hello
hi

cat &lt;&lt;EOF> test.txt
> haiiiii
> EOF

cat test.txt
haiiiii

解决方案 6:

经过多次测试后,我得到了一个简单但不明显的解决方案

*任务:您需要在另一个脚本中生成一个脚本,并将外部变量的值传递到内部脚本中

  1. 外部脚本“test.sh”

#!/bin/bash

OUT_FILE=out.sh
#EXT_MSG=external ## doesnt work
export EXT_MSG=external

rm -f $OUT_FILE
  1. 内部脚本“out.sh”

cat &lt;&lt;&#039;EOF&#039;>> $OUT_FILE
#!/bin/bash

INT_MSG=internal

MSG1=$INT_MSG
MSG2=$EXT_MSG

echo ${MSG1}
echo ${MSG2}
echo &quot;---&quot;
echo $EXT_MSG

EOF

chmod +x $OUT_FILE
./$OUT_FILE
  1. 输出结果

internal
external
---
external

解决方案 7:

不确定不使用 bash 执行此操作是否算答案。

python -c &#039;with open(&quot;brightup.sh&quot;, &quot;w&quot;) as fp: fp.write(&quot;&quot;&quot;
!/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&quot;&quot;&quot;)&#039;

或者将脚本粘贴到控制台(最后按 Ctrl+d):

python -c &#039;import sys; fp= open(&quot;brightup.sh&quot;, &quot;w&quot;); print(&quot;paste script:&quot;); fp.write(&quot;&quot;.join(sys.stdin.readlines())); fp.close()&#039;
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用