概述:
用过linux的都知道,echo和cat是我们常用的展示内容和写入内容的方式。
最近在使用这两个最简单的命令时,遇到了特殊字符写入失败问题。
这里重新学习一下echo和cat两个命令,记录一下。
三种失败场景
问题现象1:echo使用了-e但是特殊字符还是生效了
命令:
echo -e 'aa\taa' > a.txt cat a.txt
结果:
解释:
echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
可用参数说明:
-n 不要在最后自动换行
-e 若字符串出现以下字符,仍以特殊字符处理。
特殊字符如下:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
问题现象2:cat内容中带有$符号,字符丢失
命令:
cat << EOF > a.txt
eth=pwd
PATH=${eth}
EOF
结果:
cat a.txt
解释:
cat内容中带有$变量的时候会将 $和变量名 变成空格,可以添加转义字符\搞定。
也可以是将前面的EOF,增加‘’或者“”或者\,都可以解决,即是’EDF’,“EOF”,\EOF。
问题现象3:<<- 重定向时,制表符消失
命令:
注意这里是 <<- EOF
cat <<- EOF > a.txt
eth=pwd
PATH=/\${eth}
EOF
结果:
cat a.txt
解释:
Here Document 是在Linux Shell 中的一种特殊的重定向方式。
基本形式:
cmd << delimiter
Here Document Content
delimiter
作用:
将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数;
注意事项如下:
- @1、EOF 只是一个标识而已,可以替换成任意的合法字符
- @2、作为结尾的EOF前后不能有任何字符
- @3、作为起始的EOF前后的空格会被省略掉
- @4、重定向增加参数"-"的时候。会清除中间内容的制表符
总结
往文件里面写内容的最好方式是啥呢?
- 使用Here Document写法
- 转义EOF这个特殊字符
追加内容的场景:
cat << \EOF >> 文件名
文件内容
EOF
覆盖内容的场景:
cat << \EOF >文件名
文件内容
EOF