在shell脚本程序中向一条命令传递输入的一种特殊方法就是使用Here文档,它允许一条命令在获得输入数据时就好像是在读取一个文件或者键盘一样,实际上是从脚本程序中得到输入数据。
here文档就是一段具有特殊目的的代码块,它使用I/O重定向的方式将一个命令序列传递到一个交互程序或者命令中。
格式
[命令] << [标识符]
命令序列
...
...
[标识符]
应用
将命令序列传到另一个命令
#/bin/bash
cat << END
hello
hello world
Nice to meet you
END
end标识符限定了here文档的起始和结束位置。此文档实现了将语句传递cat命令。执行shell脚本的结果为:
[lzk@localhost 33_class_3_26_shell]$ ./test.sh
hello
hello world
Nice to meet you
将命令序列输入进一个文件(生产Makefile)
#!/bin/bash
SRC=$(echo *.c)
BIN=testfun
CC=gcc
cat << EOF > Makefile ##输出重定向到Makefile文件
${BIN}:$SRC
$CC -o \$@ \$^
.PHONY:clean
clean:
rm -f $BIN
EOF
结果生产Makefile文件:
[lzk@localhost fun]$ cat Makefile
testfun:test.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f testfun
将命令序列传递给交互式程序
将命令序列传递给ed编辑器。
[[ $# -ne 1 ]] && {
printf "Please input `basename $0` [filename]"
exit -1
}
ed $1<< END ### 打开文件
i
hello world #输入
Nice to meet you #输入
. ## 保存退出
w
q
END
结果:
[lzk@localhost 33_class_3_26_shell]$ ./test.sh 1.txt
0
29
[lzk@localhost 33_class_3_26_shell]$ ls
1.txt shell test.sh
[lzk@localhost 33_class_3_26_shell]$ cat 1.txt
hello world
Nice to meet you
将命令序列传递给vim编辑器:
[[ $# -ne 1 ]] && {
printf "Please input `basename $0` [filename]"
exit -1
}
vim $1<< END
i
hello world ssss
Nice to meet you
^[
:wq
END
利用vim编辑器退出保存时需要ESC键,如何输入ESC键呢?
模拟ESC键:按住ctrl+v,再按esc,就会输入一个“^[”,就是ESC键。
结果:
[lzk@localhost 33_class_3_26_shell]$ ./test.sh 1.txt
Vim: Warning: Input is not from a terminal //vim报出警告:不是从终端输入
[lzk@localhost 33_class_3_26_shell]$ cat 1.txt
hello world ssss
Nice to meet you
使用here文档控制mysql
mysql<< END
show databases;
use mysql;
select * from user
END
结果:
[root@localhost 33_class_3_26_shell]# ./test.sh
Database
information_schema
mysql
test
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connectionsmax_user_connections
localhost root Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y 00 0 0
localhost.localdomain root Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y Y0 0 0 0
127.0.0.1 root Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y YY Y Y Y Y Y Y Y Y Y 00 0 0
localhost N N N N N N NN N N N N N N N N N NN N N N N N N N N N 00 0 0
localhost.localdomain N N N N N NN N N N N N N N N N NN N N N N N N N N N N0 0 0 0