EOF分界符和追加输入(交互式新技能get起来!!!!)

原理说明

在shell编程中,”EOF“通常与”<<“结合使 用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符 (delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和 shell命令冲突。其使用形式如下:

交互式程序(命令)<<EOF
command1
command2
...
EOF

”EOF“中间的内容将以标准输入的形式输入到”交互式程序“,当shell看到”<<“知道其后面输入的分界符,当shell再次看到分界符时,两个分界符中间的部分将作为标准输入。
"EOF"一般常和cat命令连用。
注意,最后的”EOF“必须单独占一行。

当然这个标志性字符不能用保留字,最常用的还是EOF。
需要注意的是,第一个EOF必须以重定向字符<<开始,第二个EOF必须顶格写,否则会报错。

实例测试

下面以cat命令为例讲解”EOF“使用。一般有以下两种形式

1.cat<<EOF
2.cat<<EOF>filename或者cat<<EOF>>filename(cat<<EOF>filename或者cat<<EOF>>filename )

其实,第一种形式和第二种形式没有什么本质的区别,第一种形式将内容直接输出到标准输出(屏幕),而第二种形式将标准输出进行重定向,将本应输出到屏幕的内容重定向到文件而已。

例1

[root@controller eof]# cat<<EOF
> hi bro
> good luck
> lucky 2020
> EOF
hi bro
good luck
lucky 2020
[root@controller eof]# 

例2

如果用>就是写入,会覆盖 之前文件中的内容!

[root@controller eof]# cat>eof.log<<EOF
hi bro 
good luck
lucky 2020
2020 lucky 
EOF
[root@controller eof]# cat eof.log     
hi bro 
good luck
lucky 2020
2020 lucky 
[root@controller eof]# cat >eof.log<<EOF
> now test
> EOF
[root@controller eof]# cat eof.log 
now test
[root@controller eof]# 

例3

[root@controller eof]# cat>>eof.log<<EOF
> hi bro
> EOF
[root@controller eof]# cat eof.log 
hi bro
[root@controller eof]# cat>>eof.log<<EOF
> good luck
> lucky 2020
> EOF
[root@controller eof]# cat eof.log 
hi bro
good luck
lucky 2020
[root@controller eof]# 

EOF交互式说明

Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。如下:

export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
sqlplus $USERID @$OUT_FILE << EOF
exit
EOF

当把这段代码放在Shell中时,会在Shell脚本执行完毕后自动退出SQLPLUS的命令提示符状态。

<<EOF
(内容)
EOF

可以把EOF替换成其他东西
意思是把内容当作标准输入传给程序
这里再简要回顾一下< <的用法。当shell看到<<的时候,它就会知道下一个词是一个分界
符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个
分界符可以是你所定义的任何字符串。

EOF交互式使用

  • 1、用来查询数据库
    需要,自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录.
#!/bin/sh
mysql -uroot -p123456 <<EOF
use test;
select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int 
                                                  # type,only char type need single quote mark.
exit
EOF
  • 2、用来执行脚本
    就是把脚本内容放在 EOF 里面。
[root@controller eof]# cat 1.sh 
#!/bin/bash

# 这个ip可以放文件,或者用遍历方式实现 批量运行哦。
ssh  192.168.198.130 << EOF
ls
df -Th
systemctl restart network
#这可以放任何代码
EOF
[root@controller eof]#
[root@controller eof]#
[root@controller eof]#
[root@controller eof]# sh 1.sh 
Pseudo-terminal will not be allocated because stdin is not a terminal.

root@192.168.198.130's password: 
anaconda-ks.cfg
ccx
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
Pictures
Public
Templates
Videos
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        47G  4.6G   43G   10% /
devtmpfs                devtmpfs  894M     0  894M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M   19M  892M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M   18% /boot
tmpfs                   tmpfs     182M   12K  182M    1% /run/user/42
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0
[root@controller eof]# 

会用EOF交互式实现交互式以后,就会有点嫌弃expect交互式了吧!!!
下面放一个expect的脚本感受一下

#!/bin/bash

while read ip;do
user=root 
password=root
expect << EOF
set timeout 20 
spawn ssh $user@$ip
expect {
        "*assword" { send "$password\r";}
        "yes/no" {send "yes\r"exp_continue}
  } 
expect "]#" { send " useradd ccxhero\n" }
#需要注意,密码那建议加上单引号,因为如果密码中有特殊符号,如:&,如果不加单引号执行脚本就会报错!
expect "]#" { send "echo 'ccxhero' | passwd --stdin xz_tyng\n" }
send "exit\n"
expect eof
EOF
done < iplist.txt

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页