4.3.1 判断语句
1) if语句的格式:
if 条件 then 命令 fi
if 条件 then 命令 else 命令 fi
if 条件 then 命令 elif 条件 then 命令 else 命令 fi
if判断语句示例:
a例:判断当前用户是否为root,如果是,则执行/home/test 目录压缩
#!/bin/bash
if [ "$(id -u)" -eq "0" ];then
tar czf /home/test.tar.gz /home/test
fi
b例:要求用户输入密码,并判断输入是否正确
#!/bin/bash
read -p "please enter your passwd: " passwd
if [ "$passwd" == "123456" ];then
echo "passwd is ok!"
else
echo "passwd error! please input your passwd again "
fi
c例:判断kpi评级,60~70是D级,70~80是C级,80~90是B级,大于90是A
#!/bin/bash
export LANG="zh_CN.UTF-8"
if [ $1 -ge 90 ];then
echo "A绩效优秀"
elif [ $1 -ge 80 ];then
echo "B绩效良好"
elif [ $1 -ge 70 ];then
echo "C绩效一般"
elif [ $1 -ge 60 ];then
echo "D绩效合格"
else
echo "绩效差"
fi
2)case 判断语句格式:
格式1:
case $变量名 in
模式1)
命令
;;
模式2)
命令
;;
*)
esac
格式2:
case $变量名 in
模式1|模式2)
命令
;;
模式3|模式4)
命令
;;
*)
esac
case判断语句示例:
d例:判断单个字符是数字还是字母
#/bin/bash
export LANG="zh_CN.UTF-8"
read -p "请输入: " pake
case $pake in
[a-z] | [A-Z])
echo "您输入的是字母"
;;
[[:digit:]])
echo "您输入的是数字"
;;
*)
echo "无法识别特殊字符"
esac
e例:每月指定日期备份删除日志
#/bin/bash
DATE=$(date +%d)
TIME=$(date +%Y+%m+%d)
case $DATE in
1|11|21)
tar -czf /home/log/${TIME}_log_tar.gz /tmp/log/&>/dev/null
;;
2|12|22)
rm -rf /tmp/log/*.2020-*.log
;;
*)
echo "今天不删除也不备份"
esac
4.3.2 循环语句
1)for语句
语法格式:
for 变量 in 值(或者循环条件)
do
命令
done
for语句示例:打印9*9的乘法口诀
#!/bin/bash
for k in {1..9}
do
for ((p=1;p<=k;p++))
do
printf "%-10s" $p*$k=$((p*k))
done
echo
done
2)while语句
语法格式:
while 条件 do 命令 done
while read -r line do 命令 done < file
while语法示例:批量添加10个用户
#!/bin/bash
u=1
while [ $u -le 10 ]
do
useradd user${ $u }
u=$((u+1))
done
3)until语句
语法格式:
until 条件 do 命令 done
示例:批量删除用户
#!/bin/bash
u=6
until [ $u -eq 0 ]
do
userdel user${ $u }
u=$((u-1))
done
4)select语句
示例:用select生成购物询问
#!/bin/bash
export LANG="zh_CN.UTF-8"
echo "你想买哪一个颜色"
select var in "红色" "蓝色" "绿色" "黄色" "小麦色"
do
break
done
echo "你选择的是: $var"
5)控制语句
shift 将位置参数左移一位,也就是说执行shift后,$2变成$1,
countinue 中断当前循环,进入下一个循环
break 结束整个循环
exit 结束脚本的运行
4.3.3 mysql备份
备份test数据库的脚本示例:
#!/bin/bash
export LANG="zh_CN.UTF-8"
USER=root
PASSWD="123456"
DATABASE="test"
HOSTNAME="192.168.1.137"
BACKUP_DIR=/home/backup/
LOGFILE=/home/backup/mysql_backup.log
DATE=`date '+%Y-%m-%d-%H-%M'`
DUMPFILE=test_$DATE.sql
ARCHIVE=test_$DATE.sql.tgz
OPTIONS="-h$HOSTNAME -u$USER -p$PASSWD $DATABASE"
if [ ! -d $BACKUP_DIR ] ;
then
mkdir -p "$BACKUP_DIR"
fi
echo " " >> $LOGFILE
echo "———————————————–" >> $LOGFILE
echo "备份开始时间:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
echo "———————————————– " >> $LOGFILE
cd $BACKUP_DIR
mysqldump $OPTIONS > $DUMPFILE
if [[ $? == 0 ]]; then
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
echo "[$ARCHIVE] 备份成功" >> $LOGFILE
rm -f $DUMPFILE
else
echo "数据库备份失败....." >> $LOGFILE
fi
echo "数据库备份完成!!"
4.3.4 机器互通
免密互通需要使用ssh和except,先安装except,yum install expect expect-devel tcl -y
脚本示例:
#!/bin/bash
echo "按enter键3次即可"
ssh-keygen -t rsa #生成秘钥(按enter键3次即可生成)
SERVERS="arango mysql es redis" #主机名
PASSWORD=123456 #主机登录密码
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 #遍历要发送到各个主机的ip
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
ssh_copy_id_to_all
4.3.5 URL状态检测
检测脚本示例:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/loacl/sbin:~/bin
export PATH
. /etc/rc.d/init.d/functions
check_count=0
url_list=(http://www.baidu.com https://blog.51cto.com http://www.qq.com http://192.168.1.5)
function wait()
{
echo -n '3秒后开始执行检查UEL操作';
for ((i=1;i<4;i++))
do
echo -n "$i...";sleep 1
done
echo
}
function check_url()
{
wait
for ((i=0;i<`echo ${#url_list[*]}`;i++))
do
wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1
if [ $? -eq 0 ]
then
action "${url_list[$i]}" /bin/true
else
action "${url_list[$i]}" /bin/false
fi
done
((check_count++))
}
main()
{
while true
do
check_url
echo "----------check_count:$check_count----------"
sleep 2
done
}
main
4.3.6 跳板机
跳板脚本示例:
#!/bin/bash
trapper() {
trap ':' INT EXIT TSTP TERM HUP
}
main() {
while :
do
trapper
clear
cat<<EOF
1)web01-192.168.1.5
2)web02-192.168.1.6
3)web03-192.168.1.7
4)mysql-192.168.1.8
0)exit
EOF
read -p "please input the num: " num
case "$num" in
1)
echo 'login in 192.168.1.5 web01-nginx'
ssh 192.168.1.5
;;
2)
echo 'login in 192.168.1.6 web02-nginx'
ssh 192.168.1.6
;;
3)
echo 'login in 192.168.1.7 web03-nginx'
ssh 192.168.1.7
;;
4)
echo 'login in 192.168.1.8 mysql-192'
ssh 192.168.1.8
;;
0)
echo '退出'
exit
;;
*)
echo "the num you have input is error"
esac
done
}
main
4.3.7 菜单式发布应用
脚本示例:
#!/bin/bash
export LANG="zh_CN.UTF-8"
menu(){
cat << END
请选择需要更新的服务
=======================
1.app
2.admin
3.exit
=======================
END
}
TIME=`date +%Y-%m-%d-%H-%M`
tomcat_pid=`ps -ef |grep "tomcat"|grep "apache"|awk -F ' ' '{print $2}'`
app(){
cd /data/service/
cp -a app /backup/app-$time
cd app/project/
cp -a /package/app/app*.tar.gz .
rm -rf lib
tar zxf app*.tar.gz
cp -a project/lib .
/bin/bash init.sh stop
/bin/bash init.sh start
cd /backup/app-$time/project/
rm -rf logs
echo "++++++++++++++++app更新成功++++++++++++++"
}
web(){
cd /data/www/
cp -a web /backup/web-$time
cd web/
rm -rf ./*
cp -a /package/web/web*.tar.gz .
tar zxf web*.tar.gz
rm -f web*.tar.gz
echo "++++++++++++++++web更新成功++++++++++++++"
}
main(){
while true
do
menu
read -p "请输入服务的序号以更新服务:" num
case "$num" in
1)
app
;;
2)
web
;;
3)
exit 1
;;
*)
printf "输入错误 请重新输入对应数字"
esac
done
}
main
以上的脚本示例仅仅是最简单的应用,shell脚本写法自由,格式限制少,功能多是简介明了,当需要复杂示例时候,可以查看像/etc/init.d/functions这类系统脚本学习一下。