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

我想使用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"

正如@fedorqui所建议的,这是man bash的相关部分:

Here Documents

This type of redirection instructs the shell to read input from the
current source until a line containing only delimiter (with no
trailing blanks) is seen. All of the lines read up to that point are
then used as the standard input for a command.

The format of here-documents is:

06004

No parameter expansion, command substitution, arithmetic expansion,
or pathname expansion is performed on word. If any characters in word
are quoted, the delimiter is the result of quote removal on word, and
the lines in the here-document are not expanded. If word is
unquoted, all lines of the here-document are subjected to parameter
expansion, command substitution, and arithmetic expansion
. In the
latter case, the character sequence \ is ignored, and \
must be used to quote the characters \, $, and `.

上一篇:PHP字符串的定义方式及区别


下一篇:php – INSERT INTO SQL Heredoc正确的语法