通常我们用cat <<EOF来把文本内容写入文件中去,例如
cat > a.txt <<EOF
This is a test file
EOF
这样会生成一个a.txt文件,内容包含一行文本。
有两个特殊符号注意
- cat <<-EOF
在EOF前面多了一个减号(-),作用是去除文本里面所有行的tab前缀。
举例来说:
cat >a.txt <<-EOF
<tab>Line1
<tab><tab>Line2
<tab><tab>Line3<tab>Field<tab>
EOF
这个的运行结果:
- 使用<<-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的组成部分。
- 使用<<EOF
<tab>Line1
<tab><tab>Line2
<tab><tab>Line3<tab>Field<tab>
比较两个结果:
- 所有行的前缀<tab>全部被删除掉了。
- 空格前缀也不会被删除,只删除<tab>前缀。
- 中间和结尾处的<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文本文件。
网友评论