其实我对这个东西的用法理解也不深,目前也只用过两次,但真的可以解决大问题。
通过Java的SSH方式可以便利的执行各种shell脚本,让程序员解脱每次查询问题都要登录到linux服务器的情况
先说一下<<efo的作用,官方的说法是这样的:在shell脚本中(bash编程),<<EOF表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主Shell。而EOF可以换成任何其他字符都可以。
我的的理解是这样的:当想自动完成一个程序的输入的时候就可以用这个方法,举例说明吧。
1、OGG远程监控执行脚本命令:
SSH执行oracle环境变量命令,在通过执行oracle环境变量,在到ogg19.1目前下执行/ggsci,再尔开始脚本命令行
——————————————————本次查询语句为:
source /home/oracle/.bash_profile&&/zoedata/ogg19.1//ggsci
<<EOF
info all
quit
EOF
2、挂在磁盘监控的bash脚本命令
比如想自动完成树莓派centos系统空间自动扩容(当然现在有更简单的办法,这只是个思路)。一般是用fdisk然后按向导来,如果用脚本自动完成就是这个样子:
#!/bin/bash
fdisk /dev/mmcblk0 <<eof
d
3
n
p
3
w
eof
看起是不是一脸懵,但就是这样,上面完成的是如下向导的操作:
fdisk /dev/mmcblk0
执行命令:d (删除分区命令)
输入:3 (删除第3个分区)
执行命令:n (加分区)
执行命令:p (主要分区)
直接回车默认(第一次)
直接回车默认(第二次)
(所在脚本里那两个空行不可少)
执行命令:w(存盘)
eof结束输入退出
efo退出fdisk
3、在做树莓派连接蓝牙模块
派和蓝牙是同时给电的,但派给完电要等一会才能完成启动,如果蓝牙模块能够自动回连还好,
如果不能回连就要用到这个方法了,因为要启动bluetoothctl后进行l输入命令操作,具体如下:
#!/bin/bash
bluetoothctl <<eof
connect F1:DB:7C:FB:8D:8F
quite
eof
上面的代码是已手动连接过的代码,不然不行。表示的意思就是:
bluetoothctl 启动蓝牙控制台
connect F1:DB:7C:FB:8D:8F连接该地址的蓝牙设备
quite 退出蓝牙控制台
eof 结束输入退出。
====Shell脚本OGG监控记录===
开发监控模块加人对ogg基本监控指标,监控软件每次调用只需要获取1行字符串结果,直接保存到结果表中,写了个简单ogg定期保存ogg状态 延时结果数据
[oracle@db ~]$ more ogg_process.sh
#!/bin/bash
######配置Oracle环境变量#########
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.3/db_1
export PATH=$ORACLE_HOME/bin:$PATH:$ORACLE_HOME/jdk/bin
######配置ogg环境变量#######
export OGG_HOME=/ogg
export PATH=$OGG_HOME:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LOGFILE=/home/oracle/ogg.log
export tmpfile=/tmp/oggtemp
cd $OGG_HOME
date -d today +"%Y-%m-%d %H:%M:%S" > $tmpfile
(echo info all;echo exit)|./ggsci|grep -E "EXTRACT|REPLICAT" |awk 'BEGIN {FS=" +"} {print $1,$3,$2,$4,$5}' >> $tmpfile
#多行合并
cat $tmpfile |awk BEGIN{RS=EOF}'{gsub(/\n/," ; ");print}' > $LOGFILE
====Linux命令执行顺序— ||和&&和;===扩展
Linux命令执行顺序— ||和&&和;
command1 && command2: &&左边的command1执行成功(返回0表示成功)后,&&右边的command2才能被执行。
command1 || command2: 如果||左边的command1执行失败(返回1表示失败),就执行&&右边的command2。
command1;command2: 命令顺序执行
//第一个命令执行不成功,第二个命令才执行
[tough@toughhou shell]cata||touchacat:a:Nosuchfileordirectory[tough@toughhoushell] ls
a getpath.sh
//第一个命令执行成功,第二个命令不执行
[tough@toughhou shell]cata||touchb[tough@toughhoushell] ls
a getpath.sh
//只有第一个命令(touch a)执行成功,才执行第二个命令(touch b)
[tough@toughhou shell]touch a && touch b
[tough@toughhou shell] ls
a b getpath.sh
//因为第一个命令执行不成功,所以第二个命令没执行
[tough@toughhou shell]cat a1 && touch c
cat: a1: No such file or directory
[tough@toughhou shell] ls
a b getpath.sh
//命令顺序执行
[tough@toughhou shell]$ pwd;more a;date
/home/tough/shell
123
Sun Oct 13 10:24:55 CST 2013 <br><br><br>
刚才输入命令 echo "This is file content, over!" > filename 竟然会出错,提示:
bash: !": event not found
原来字符串中的!会被解析。如果不出错的话呢,转义!就可以了,如 \! ,
或者把双引号改成单引号也行。