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