一、 for循环使用
基础语法
for var in 数据域(表达式)
do
语句1
done
代码案例
1.循环3次hello world ,打印循环池内容
#!/bin/bash
for i in www.jd.com www.qq.com www.4399.com
do
echo $i hello world.
done
2.ping 网段范围内地址
(1)打印网段地址
for i in 1 2 3
do
echo 192.168.101.$i
done
(2)ping 网段数据
#!/bin/bash
for i in 1 2 3
do
ping -c3 192.168.1.$i
if [ $i -eq 0 ];then
echo 192.168.1.$i >> /tmp/ping_ok.txt
else
echo 192.168.1.$i >> /tmp/ping_error.txt
fi
done
3.局域网IP探活脚本
#!/bin/bash
for i in $(echo {1..100}) #除此之外还可以写成$(seq 1 5)
do
ping -c3 192.168.1.$i
if [ $i -eq 0 ];then
echo 192.168.1.$i >> /tmp/ping_ok.txt
else
echo 192.168.1.$i >> /tmp/ping_error.txt
fi
done
4.自动化执行远程机器命令
#### v1 版本远程ssh
#!/bin/bash
for i in $(seq 1 5)
do
ssh -l root 127.0.0.$i "df -h"
done
#### v2 版本远程ssh免密登录
1.首先执行ssh-keygen命令 ,生成机器公钥
2.然后将公钥信息发给服务端予以免密认证
免密认证的原理是用机器私钥匙去验证解密机器,但前提是确保免密登录的机器上含有公钥信息
/root/.ssh/id_rsa.pub
ssh-copy-id -i /root/.ssh/id_rsa.pub 127.0.0.1
#!/bin/bash
for i in $(seq 1 5)
do
echo -e "\033[32m127.0.0.$i exec command:\033[0m"
ssh -l root 127.0.0.$i "df -h"
sleep 2
done
5.实现nginx文件的远程拷贝和日志备份
### 1. nginx软件包的远程拷贝
#!/bin/bash
for i in $(seq 1 5)
do
echo -e "\033[32m 127.0.0.0.$i exec command:\033[0m"
scp -r nginx.1.26.0.tar.gz 127.0.0.$i:/tmp/ n ## 此时需要保证tar包和sh脚本是平级的
sleep 2
done
echo "==================================="
echo "检查机器目录存的tar包是否存在?"
for i in $(seq 1 5)
do
ssh -l root 127.0.0.$i "ls /tmp/"
sleep 2
done
### 2.nginx 日志拷贝
#!/bin/bash
for i in $(ls *.log)
do
tar -czf ${i}.tar.gz $i
## tar -xzf $i ## 解压tar包
rm -rf $i
done
6.打印1-100数字并进行求和
### 方法一:命令方式打印
echo {1..100} | sed 's/ / + /g'|xargs expr
### 方法二:for循环遍历求和
j=0
for i in $(seq 1 100) ### 也可换成 for ((i=1;i<=100;i++))
do
j=`expr $i +$j`
done
echo $j
7.for循环打印10秒等待提示
for((i=1;i<=10;i++))
do
echo -ne "\033[32m-033[0m" ## -n表示不换行
sleep 1
done
二、while 循环使用
while 循环相较于for循环需要满足其特定条件才会退出循环,而不会像for循环存在一个连续的数据域
基础语法
while (表达式)
do
语句1
done
代码案例
1.打印good evening
#!/bin/bash
## 无限次
while true
do
echo good evening!!!
sleep 1
done
## 限制10次
i=1
while (($i<=10))
do
echo good evening!!!
sleep 1
i=`expr $i + 1` ## 类似于((i++))
done
2.打印1~100数并进行累加
#!/bin/bash
i=1
j=0
while (($i<=100))
do
echo $i
j=`expr $i + $j`
i=`expr $i + 1`
done
echo $j
3.远程执行命令
#!/bin/bash
i=1
while (($i<=5))
do
echo -e "\033[32m127.0.0.$i exec command:\033[0m"
ssh -l root 127.0.0.$i "df -h"
sleep 1
i=`expr $i + 1`
done
4.远程拷贝命令
#!/bin/bash
i=1
while (($i<=5))
do
echo -e "\033[32m127.0.0.$i exec command:\033[0m"
scp -r redis-1.2.6.tar.gz root@127.0.0.$i:/tmp
i=`expr $i + 1`
sleep 1
done
5.循环读取文件内容
#!/bin/bash
while read INPUT
do
echo $INPUT
done < list.txt
6.一键局域网ip探活
#!/bin/bash
i=1
while(($i<=254))
do
ping -c3 192.168.1.$i
if [ $? -eq 0 ];then
echo 192.168.1.$i >> /tmp/ping_ok.txt
else
echo 192.168.1.$i >> /tmp/ping_error.txt
fi
i=`expr $i + 1`
done
7.判断/etc/passwd是否更改
#!/bin/bash
## 若md5的值不相等,则证明被篡改了,
while true
do
OLD_MD5=$(md5sum /etc/passwd|cut -d " " -f1)
sleep 5
NEW_MD5=$(md5sum /etc/passwd|cut -d " " -f1)
if [ $OLD_MD5 != $NEW_MD5 ];then
echo $(date)
echo
echo "密码文件/etc/passwd被修改了,请检查>>>>>"
done
8.每隔5s监控网站
#!/bin/bash
i=0
while true
do
curl -s "https://www.baidu.com"
sleep 5
done
三、case多条件使用
基础语法
case $1 in
pattern 1)
语句1
;;
pattern 2)
语句2
;;
pattern 3)
语句3
;;
esac
代码案例
1.实现nginx功能多条件选择
#!/bin/bash
case $1 in
download )
wget -c http://nginx.org/download/nginx-1.26.1.tar.gz -P /usr/src
;;
extract )
tar -xzvf nginx-1.26.1.tar.gz
;;
intall )
cd nginx-1.26.1
yum -y install gcc make pcre-devel zlib-devel
./configure;make;make install
;;
start )
/usr/local/nginx/sbin/nginx
sleep 1
ps -ef | grep -aiE nginx
;;
* )
echo -e "\033[32m-----------------\033[0m"
echo -e "\033[32mUsage:{/bin/sh $0 download|extract|install|start|help}\033[0m"
esac
四、select选择菜单使用
基础语法
select i in (表达式)
do
语句
done
代码案例
1.v1 单独使用select命令
#!/bin/bash
### 配合PS3可以做打印提示
PS3="请选择你喜欢的操作系统:"
select i in Centos RedHat Ubuntu Openeuler Quit
do
if [ $i == "Quit"];then
exit
fi
echo "Your select system:" $i
done
2. v2 case结合select使用
#!/bin/bash
PS3="Pleaseinput you selct install menu:"
select i in php http mysql quit
do
case $i in
http)
echo Test Httpd.
;;
php)
echo Test php.
;;
mysql)
echo Test mysql.
;;
quit)
echo The system exit.
exit
;;
esac
done