参考链接:
http://blog.163.com/njut_wangjian/blog/static/1657964252013112152418345/
http://blog.csdn.net/cybermerman/article/details/8694048
在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。其使用形式如下:
-
交互式程序(命令)<<EOF
-
command1
-
command2
-
...
-
EOF
”EOF“中间的内容将以标准输入的形式输入到”交互式程序“,当shell看到”<<“知道其后面输入的分界符,当shell再次看到分界符时,两个分界符中间的部分将作为标准输入。
注意,最后的”EOF“必须单独占一行,。
举例
"EOF"一般常和cat命令连用。一般有以下两种形式(两种无本质区别)
1.cat<<EOF 第一种形式将内容直接输出到标准输出(屏幕)
2.cat<<EOF>filename或者cat<<EOF>>filename(cat<<EOF>filename或者cat<<EOF>>filename )
第二种形式将标准输出进行重定向,将本应输出到屏幕的内容重定向到文件而已。
例1:
#cat<<EOF #结果直接显示到屏幕上
>12
>34D
>EOF
12
34D
例2:
#cat>>filename<<EOF #结果先追加到filename文件中
>DHA
>23
>EOF
#cat filename #查看文件可看到追加的内容
DHA
23
举例3.简单登录
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向:"command << delimiter 从标准输入中读入,直至遇到分界符。
不过这种只是简单的交互,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF
重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。
举例4.shell调用
-
#!/bin/bash
-
printf "Do you want to see the menu?"
-
read answer
-
if [[ $answer == "yes" ]]
-
then
-
cat <<-end
-
1)line1
-
2)line2
-
3)line3
-
end
-
fi
执行脚本提示
-
eof.sh: line 13: warning: here-document at line 8 delimited by end-of-file (wanted `end')
-
eof.sh: line 14: syntax error: unexpected end of file
分析:
1.cat命令后接<<和一个用户定义的终止符,在这里是EOF。终止符后面作为cat命令的输入,在屏幕上产生菜单选项,当达到最后的终止符后,输入结束。
2.末尾终止符恰好和的起始终止符相匹配,否则menu文档将不会结束。另外,最后的终止符周围不能有任何空格。有良好习惯的程序员往往会使用
缩进来增强脚本的可读性,但这个例子中恰巧是因为对第十行的EOF使用缩进(使用Tab缩进)导致的一个语法错误。
解决方案:
1.将用于终止的EOF移到页的最左侧,确保它周围没有空格(但是这种方式看起来不美观哦~)。
2.bash/ksh/sh这3种shell允许使用另外一种方式。即在开始<<符号后面加一个长划线:cat <<-EOF【注意:<<后面直接跟-否则如果有空格,也会报错~】。这样就可以使用tab来缩进第十行中用来结束输入的终止符。
阅读(1248) | 评论(0) | 转发(0) |