1、打印9*9乘法表
示例代码:
#!/bin/bash
for((i=1;i<=9;++i)) do for((j=1;j<=i;j++)) do echo -ne "$i*$j=$((i*j))\t" done echo done |
解释
-n 不加换行符
-e 解释转义符
echo 换行
2、自动部署集群的JDK
需求描述
公司内有一个N个节点的集群,需要统一安装一些软件(jdk) 需要开发一个脚本,实现对集群中的N台节点批量自动下载、安装jdk |
思路
思考一下:我们现在有一个JDK安装包在一台服务器上。那我们要实现这个目标:
|
Expect的使用
蛋疼点:假如在没有配置SSH免密登录的前提下,我们要要是scp命令从一台机器拷贝文件夹到另外的机器,会有人机交互过程,那我们怎么让机器自己实现人机交互?
灵丹妙药:expect
命令 |
描述 |
set |
可以设置超时,也可以设置变量 |
timeout |
超时等待时间,默认 10s |
spawn |
执行一个命令 |
expect "" |
匹配输出的内容 |
exp_continue |
继续执行下面匹配 |
注意:如果机器没有expect,则请先安装expect
yum install -y expect
用法:
示例:观看配置SSH免密登录的过程
[root@hadoop02 bin]# vi testExpect.sh
#!/bin/bash
## 定义一个函数 sshcopyid(){ expect -c " spawn ssh-copy-id $1 expect { \"(yes/no)?\" {send \"yes\r\";exp_continue} \"password:\" {send \"$2\r\";exp_continue} } " } ## 调用函数执行 sshcopyid $1 $2 |
思路:模拟该人机交互过程,在需要交互的情况下,通过我们的检测给输入提前准备好的
脚本实现
- 启动脚本initInstallJDK.sh
#!/bin/bash
SERVERS="192.168.123.201"
PASSWORD=hadoop
BASE_SERVER=192.168.123.202
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id $1;
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
*password:* {send -- $2\r;exp_continue;}
eof {exit 0;}
}";
}
ssh_copy_id_to_all() {
for SERVER in $SERVERS
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
ssh_copy_id_to_all
for SERVER in $SERVERS
do
scp installJDK.sh root@$SERVER:/root
ssh root@$SERVER chmod 755 installJDK.sh
ssh root@$SERVER /root/installJDK.sh
done
- 安装脚本installJDK.sh
#!/bin/bash
BASE_SERVER=192.168.123.202
yum install -y wget
wget $BASE_SERVER/soft/jdk-8u73-linux-x64.tar.gz
tar -zxvf jdk-8u73-linux-x64.tar.gz -C /usr/local
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk1.8.0_73
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
总结
写脚本注意事项:
1、开头加解释器: #!/bin/bash,和注释说明。
2、命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。
3、默认变量是全局的,在函数中变量 local 指定为局部变量,避免污染其他作用域。
4、set -e 遇到执行非 0 时退出脚本, set -x 打印执行过程。
5、写脚本一定先测试再到生产上。