shell中的cat和文件分界符(<<EOF)
在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任何字符串)紧跟在<<符号后,意思是分界符后的内容将被当做标准输入传给<<前面的命令,直到再次在独立的一行遇到这个文件分界符(EOF或者其他任何字符,注意是独立一行,EOF前面不能有空格)。通常这个命令是cat,用来实现一些多行的屏幕输入或者创建一些临时文件。
1、最简单的用法
root@ribbonchen-laptop:~# cat<<EOF
> ha
> haha
> hahaha
> EOF
输出:
ha
haha
hahaha
2、把输出追加到文件
root@ribbonchen-laptop:~# cat<<EOF>out.txt
> ha
> haha
> hahaha
> EOF
root@ribbonchen-laptop:~# cat out.txt
ha
haha
hahaha
3、换一种写法
root@ribbonchen-laptop:~# cat>out.txt<<EOF
> ha
> haha
> hahaha
> EOF
root@ribbonchen-laptop:~# cat out.txt
ha
haha
hahaha
4、cat>filename,创建文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束
root@ribbonchen-laptop:~# cat>filename
ha
haha
hahaha
root@ribbonchen-laptop:~# cat filename
ha
haha
hahaha
下面的脚本实现了一个简单的菜单功能:
#!/bin/bash
MYDATE=`date +%d/%m/%Y`
THIS_HOST=`hostname`
USER=`whoami`
while :
do
clear
cat<<EOF
_______________________________________________________________
User:$USER Host:$THIS_HOST DATE:$MYDATE
_______________________________________________________________
1:List files in current dir
2:Use the vi editor
3:See who is on the system
H:Help sreen
Q:Exit Menu
_______________________________________________________________
EOF
echo -e -n "\tYour Choice [1,2,3,H,Q]>"
read CHOICE
case $CHOICE in
1) ls
;;
2) vi
;;
3) who
;;
H|h)
cat<<EOF
This is the help screen,nothing here yet to help you!
EOF
;;
Q|q) exit 0
;;
*) echo -e "\t\007unknown user response"
;;
esac
echo -e -n "\tHit the return key to continue"
read DUMMY
done
#!/bin/bash
TARGET_DIR=$PWD
cd /
list=`cat << EOF
usr/local/Trolltech/QtEmbedded-4.6.3-arm/examples/widgets/wiggly/wiggly
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher/screenshots/raycasting.png
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher/slides/demo_6.png
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher/slides/demo_3.png
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher/slides/demo_5.png
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher/fluidlauncher
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher/config.xml
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/styledemo/styledemo
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/pathstroke/pathstroke.html
usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/pathstroke/pathstroke
EOF
`
tar cfvz $TARGET_DIR/target-qte-4.6.3.tgz $list
EOF本意是 End Of File,表明到了文件末尾。
使用格式基本是这样的:
命令 << EOF
内容段
EOF
将“内容段”整个作为命令的输入。
你的代码里就是用cat命令读入整段字符串并赋值给list变量。
其实,不一定要用EOF,只要是“内容段”中没有出现的字符串,都可以用来替代EOF,只是一个起始和结束的标志罢了。
有个特殊用法不得不说:
: << COMMENTBLOCK
shell脚本代码段
COMMENTBLOCK
这个用来注释整段脚本代码。 : 是shell中的空语句。
搜索一下 Here document 你会明白更多。
如果就一行,那么直接赋值即可:
list="usr/local/Trolltech/QtEmbedded-4.6.3-arm/examples/widgets/wiggly/wiggly"
EOF相当于读文件的方式,适用于多行内容的操作。
技术改变世界!
--狂诗绝剑