如何 cat <<EOF >> 包含代码的文件?
- 2024-09-30 15:23:00
- admin 原创
- 119
问题描述:
我想使用以下方法将代码打印到文件中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
我尝试添加单引号,但输出中也带有单引号。我该如何避免此问题?
解决方案 1:
您只需要进行最小的更改;在 之后用单引号括住此处的文档分隔符<<
。
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 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。 直到该点为止读取的所有行都将用作命令的标准输入。
here-documents 的格式为:
<<[-]word here-document delimiter
不对 word 执行任何参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则分隔符是 word 上引号删除的结果,并且不会扩展此处文档中的行。 如果 word 未被引用,则此处文档的所有行都将受到参数扩展、命令替换和算术扩展。在后一种情况下,字符序列
<newline>
将被忽略,并且 ``
必须用来引用字符、`$`和
`。
对于相关问题,另请参阅<https://stackoverflow.com/a/54434993>
解决方案 2:
这应该可行,我刚刚测试了一下并且它按预期工作:没有发生扩展、替换或其他事情。
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/bin
,file
则将如下所示:
cd "/home/foobar"
echo "/home/foobar/bin"
而不是预期的:
cd "$HOME"
echo "$PWD"
解决方案 3:
或者,使用 EOF 标记,您需要引用初始标记,这样就不会进行扩展:
#-----v---v------
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
解决方案 4:
我知道这是一个两年前的问题,但对于那些寻找“如何做”的人来说,这是一个快速的答案。
如果您不想在任何内容周围加上引号,您可以简单地将一个文本块写入文件,并转义您想要导出为文本的变量(例如用于脚本),而不是转义您想要导出为变量值的变量。
#!/bin/bash
FILE_NAME="test.txt"
VAR_EXAMPLE="\"string\""
cat > ${FILE_NAME} << EOF
${VAR_EXAMPLE}=${VAR_EXAMPLE} in ${FILE_NAME}
EOF
会将 '"${VAR_EXAMPLE}="string" in test.txt' 写入 test.txt
这也可以用来通过省略文件名以相同的规则将文本块输出到控制台
#!/bin/bash
VAR_EXAMPLE="\"string\""
cat << EOF
${VAR_EXAMPLE}=${VAR_EXAMPLE} to console
EOF
将输出“”${VAR_EXAMPLE} =“string”到控制台”
解决方案 5:
cat with<<EOF>>
将创建或附加内容到现有文件,不会覆盖。而 cat with<<EOF>
将创建或覆盖内容。
cat test.txt
hello
cat <<EOF>> test.txt
> hi
> EOF
cat test.txt
hello
hi
cat <<EOF> test.txt
> haiiiii
> EOF
cat test.txt
haiiiii
解决方案 6:
经过多次测试后,我得到了一个简单但不明显的解决方案
*任务:您需要在另一个脚本中生成一个脚本,并将外部变量的值传递到内部脚本中
外部脚本“test.sh”
#!/bin/bash
OUT_FILE=out.sh
#EXT_MSG=external ## doesnt work
export EXT_MSG=external
rm -f $OUT_FILE
内部脚本“out.sh”
cat <<'EOF'>> $OUT_FILE
#!/bin/bash
INT_MSG=internal
MSG1=$INT_MSG
MSG2=$EXT_MSG
echo ${MSG1}
echo ${MSG2}
echo "---"
echo $EXT_MSG
EOF
chmod +x $OUT_FILE
./$OUT_FILE
输出结果
internal
external
---
external
解决方案 7:
不确定不使用 bash 执行此操作是否算答案。
python -c 'with open("brightup.sh", "w") as fp: fp.write("""
!/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""")'
或者将脚本粘贴到控制台(最后按 Ctrl+d):
python -c 'import sys; fp= open("brightup.sh", "w"); print("paste script:"); fp.write("".join(sys.stdin.readlines())); fp.close()'
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件