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

2024-09-30 15:23:00
admin
原创
271
摘要:问题描述:我想使用以下方法将代码打印到文件中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;
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用