如何猫<< 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

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


你只需要一点点改变; 在<<之后引用here-document分隔符。

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"

或者,使用您的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

IHTH


这应该起作用,我只是测试了一下,它按预期工作:没有扩展,替代或发生了什么。

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"
链接地址: http://www.djcxy.com/p/56871.html

上一篇: How to cat <<EOF >> a file containing code?

下一篇: How can I write a heredoc to a file in Bash script?