bash的cat <<EOF的用法

转至:https://www.jianshu.com/p/3a0f80054dad

通常我们用cat <<EOF来把文本内容写入文件中去,例如:

cat > a.txt <<EOF
This is a test file
EOF

这样会生成一个a.txt文件,内容包含一行文本。

有两个特殊符号注意:

  1. cat <<-EOF
    在EOF前面多了一个减号(-),作用是去除文本里面所有行的tab前缀。

举例来说:

cat >a.txt <<-EOF
<tab>Line1
<tab><tab>Line2
<tab><tab>Line3<tab>Field<tab>
EOF

这个的运行结果:

  1. 使用<<-EOF
Line1
Line2
Line3<tab>Field<tab>

这个属性在一个应用的场景下就是整体缩进:

if [ <cond-expression> ]; then
    cat >a.txt <<-EOF
      line 1
      line 2
      line X
    EOF
fi

整个代码结构显得比较整齐;这里要注意的是:

  • 内容行line 1, line 2, line X必须用<tab>作为前缀。
  • 结尾行EOF也必须用<tab>作为前缀。
  • 命令行cat没有要求,<tab>和空格都可以,因为它不是EOF的组成部分。
  1. 使用<<EOF
<tab>Line1
<tab><tab>Line2
<tab><tab>Line3<tab>Field<tab>

比较两个结果:

  1. 所有行的前缀<tab>全部被删除掉了。
  2. 空格前缀也不会被删除,只删除<tab>前缀。
  3. 中间和结尾处的<tab>也不会被删除,只删除前缀位置的<tab>。
cat <<'EOF'

就是把EOF用引号括起来(单引号和双引号一样),但是结尾处的EOF不要引号;起用法的差异是是否对文本进行变量扩展。

距离来说:

VAR="value"

cat >a.txt <<EOF
variabe is "${VAR}"
EOF

这个运行的结果是:

variabe is "value"

再加上引号:

VAR="value"

cat >a.txt <<'EOF'
variabe is "${VAR}"
EOF

这回的运行结果:

variabe is "${VAR}"

这回的结果是变量${VAR}没有进行扩展,而是按原文写入到a.txt文本文件。



posted @ 2022-04-24 10:35  study_goup  阅读(1637)  评论(0编辑  收藏  举报