#!/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
谁能详细解释下这个脚本?
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