关于linux shell <<delimiter (此处文档)的用法

#!/bin/bash
if [ -z "$1" ]
then
echo "Usage:`basename $0` filename"
exit 1
fi
vi $1 <<CLOUD
i
This is line 1
This is line 2
^[
zz
CLOUD
exit 0
谁能详细解释下这个脚本?

先判断"$1"(脚本的第一个参数)是否为空字符串,如果为空,说明运行脚本时没有带参数,给出正确用法提示。basename $0 用于获取脚本文件名(去除路径)。

vi $1 <<CLOUD
.....
CLOUD
这是“此处文档”(Here documents)用法,$1是用于vi编辑的文件名,两个CLOUD中间是输入的vi命令,依次解释如下:
i --> 从默认的vi命令模式进入vi编辑模式
This is line 1 --> 编辑输入的文本行内容
This is line 2 --> 编辑输入的文本行内容
^[ --> 一个特殊转义符用于返回命令行模式。写脚本时按ctrl+v再按<Esc>就能自动打出这个字符。
zz --> 将当前正在编辑的文件保存并退出vi

exit 1 和 exit 0 用于退出脚本并返回执行状态(shell中0代表true,非0代表false)。追问

能详细解释下”此处文档“吗?

追答

“此处文档”的结构就是这样:
命令 <<标识符
要让命令接收的多行内容
标识符

主要是用于向命令传递多行内容。具体看这里:
http://linux.die.net/abs-guide/here-docs.html

追问

./9.sh aa
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
怎么没有编辑成功呢?

追答

我这边试过是可以的。
Warning信息是会看到的,但Error信息不应该有。
脚本里面zz要大写,改为ZZ应该就可以了。
小写的zz不对,会导致文件没有正常退出,会产生隐藏文件.aa.swp。
其实这种脚本里的文件处理不推荐用vi,用sed,awk之类会更方便。

追问

./9.sh cc
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Press ENTER or type command to continueVim: Finished.
Vim: Error reading input, exiting...
Vim: Finished.

linux-u1d1:~/Desktop # cat cc
cat: cc: No such file or directory

追答

注意 ^[ 符号不是手打的,而是写脚本时按ctrl+v再按自动出来的。
zz必须大写,最后的CLOUD必须顶格写。
还不行就请加我百度hi详聊吧~反正我这边是成功了,即使文件不存在也能创建。

追问

cat ee

This is line 1
This is line 2

成功了,请教下为何ee文件会有两行空白呢?

追答

你这样写就不会有空行了:
vi $1 <<CLOUD
iThis is line 1
This is line 2^[ZZ
CLOUD

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网