Shell-day09
1. 昨日回顾
1. 判断数据库主从复制脚本
2. 循环语句之while循环 无限循环
while read line
do
done < file
a=0
while [ $a -lt 10 ]
do
done
while true
do
done
3. while循环的语法示例
4. 创建不同日期的文件脚本
5. 通过读入文件的方式进行创建用户 及设置对应的密码
6. 通过读入文件创建用户 输入前缀和数量 批量创建用户 并设置随机密码
2. 随机点名脚本
1. 要有名单
2. 提示用户输入循环多少次
3. 循环打印这些名单
4. 打印最后一个人员名单
[root@db01 /service/scripts/day09]# cat while-1.sh
#!/bin/bash
#提示用户输入要循环的次数
read -p "请输入你要循环的次数:" Num
#判断输入的数字是否为正整数
if [[ ! $Num =~ ^[0-9]+$ || $Num -eq 0 ]];then
echo "你输入的不符合要求!"
exit
fi
#定义变量
Count=$(grep -c '.*' student.txt)
i=1
while [ $i -le $Num ]
do
#定义一个随机数
Ran=$(( $RANDOM % $Count + 1 ))
#循环名单
sed -n "${Ran}p" student.txt
let i++
sleep 0.5
done
Name=$(sed -n "${Ran}p" student.txt)
echo "天选子:$Name"
3. 猜数字的脚本
1. 随机输出一个1-100之间的数字 guess
2. 执行脚本时,提示用户输入一个数字
3. 判断用户输入的数字是否为正整数
4. 判断用户输入的数字跟随机数进行比较
5. 大了则输出输入的数字大了,小了就输入小了
6. 猜对了则退出 错误继续猜
7. 统计总共猜了多少次 ,错误多少次
[root@db01 /service/scripts/day09]# cat while-2.sh
#!/bin/bash
#生成随机数,一定要放在循环外面
Ran=$(( $RANDOM % 100 + 1 ))
i=0
cat<<EOF
欢迎来到Linux脱产08期猜数字游戏!
游戏规则:
请随机猜一个1-100之间的数字!
EOF
while true
do
#提示用户输入猜的数字
read -p "请输入一个你要猜的数字:" Guess
if [[ ! $Guess =~ ^[0-9]+$ ]];then
echo "你输入的不符合要求!请重新输入!"
continue
fi
#判断用户输入的是否为0或者大于100
if [ $Guess -eq 0 -o $Guess -gt 100 ];then
echo "你输入的数字不在1-100之内!请重新输入!"
continue
fi
#将用户输入的数字跟随机数进行比较
if [ $Guess -gt $Ran ];then
echo "你猜的数字大了!请往小了猜!"
elif [ $Guess -lt $Ran ];then
echo "你猜的数字小了!请往大了猜!"
else
echo "恭喜你!猜对了!"
break
fi
let i++
done
echo "你总共猜了$(($i+1))次!失败了${i}次!"
[root@db01 /service/scripts/day09]# sh while-2.sh
欢迎来到Linux脱产08期猜数字游戏!
游戏规则:
请随机猜一个1-100之间的数字!
请输入一个你要猜的数字:0
你输入的数字不在1-100之内!请重新输入!
请输入一个你要猜的数字:101
你输入的数字不在1-100之内!请重新输入!
请输入一个你要猜的数字:a
你输入的不符合要求!请重新输入!
请输入一个你要猜的数字:10
你猜的数字小了!请往大了猜!
请输入一个你要猜的数字:50
你猜的数字小了!请往大了猜!
请输入一个你要猜的数字:75
你猜的数字小了!请往大了猜!
请输入一个你要猜的数字:90
你猜的数字小了!请往大了猜!
请输入一个你要猜的数字:95
你猜的数字大了!请往小了猜!
请输入一个你要猜的数字:93
你猜的数字大了!请往小了猜!
请输入一个你要猜的数字:92
恭喜你!猜对了!
你总共猜了7次!失败了6次!
4. 分发公钥的脚本
1. 生成秘钥对
#如何免交互式的进行创建密钥对
-f filename #指定私钥文件保存的路径
-N new_passphrase #指定一个新的密码
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ""
#如何免交互式的分发公钥
-o StrictHostKeyChecking=no #忽略回复yes的交互(避免第一次交互出现公钥检查)
sshpass -p123456 #指定密码为123456,忽略交互
yum install sshpass -y
sshpass -p1 ssh-copy-id -p22 -i /root/.ssh/id_rsa.pub -o "StrictHostKeyChecking=no" root@10.0.0.70
2. 先判断对方主机是否存活
3. 存活则判断远程连接端口是否存在
4. 分发公钥
5. 返回结果
[root@db01 /service/scripts/day09]# cat while-3.sh
#!/bin/bash
#引用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#判断密钥对是否存在
if [ -f /root/.ssh/id_rsa.pub -a -f /root/.ssh/id_rsa ];then
action "密钥对存在!" /bin/true
else
action "密钥对不存在!" /bin/false
rm -rf /root/.ssh &>/dev/null
#生成密钥对
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" &>/dev/null
if [ $? -eq 0 ];then
action "密钥对生成成功!" /bin/true
else
action "密钥对生成失败!" /bin/false
exit
fi
fi
#批量探测网段内的主机是否存活
i=1
>key.log
while [ $i -lt 255 ]
do
{
Ip=172.16.1.$i
#测试主机是否存活
ping -c1 -W1 $Ip &>/dev/null
if [ $? -eq 0 ];then
action "${Ip}主机是存活的...." /bin/true
Status=$(nmap -p22 $Ip | awk '/22\/tcp/{print $2}')
if [ $Status == "open" ];then
action "${Ip}主机的远程连接端口是开放的...." /bin/true
sshpass -p1 ssh-copy-id -p22 -i /root/.ssh/id_rsa.pub -o "StrictHostKeyChecking=no" root@$Ip &>/dev/null
if [ $? -eq 0 ];then
action "${Ip}主机公钥发送成功...." /bin/true
echo "${Ip} 主机公钥发送成功!" >>key.log
else
action "${Ip}主机公钥发送失败...." /bin/false
fi
else
action "${Ip}主机的远程连接端口是关闭的!无法进行分发公钥!" /bin/false
fi
else
action "${Ip}主机不存活!" /bin/false &>/dev/null
fi
}&
let i++
sleep 0.3
done
wait
[root@db01 /service/scripts/day09]# sh while-3.sh
密钥对存在! [ OK ]
172.16.1.5主机是存活的.... [ OK ]
172.16.1.5主机的远程连接端口是开放的.... [ OK ]
172.16.1.5主机公钥发送成功.... [ OK ]
172.16.1.70主机是存活的.... [ OK ]
172.16.1.70主机的远程连接端口是关闭的!无法进行分发公钥! [FAILED]
172.16.1.81主机是存活的.... [ OK ]
172.16.1.81主机的远程连接端口是开放的.... [ OK ]
172.16.1.81主机公钥发送成功.... [ OK ]
172.16.1.170主机是存活的.... [ OK ]
172.16.1.170主机的远程连接端口是开放的.... [ OK ]
172.16.1.170主机公钥发送成功.... [ OK ]
[root@db01 /service/scripts/day09]# ssh 172.16.1.5
Last login: Wed Apr 29 11:09:18 2020
[root@lb01 ~]# logout
Connection to 172.16.1.5 closed.
[root@db01 /service/scripts/day09]# ssh 172.16.1.170
Last login: Tue Apr 28 09:08:27 2020 from 10.0.0.1
[root@db02 ~]# logout
Connection to 172.16.1.170 closed.
[root@db01 /service/scripts/day09]# cat key.log
172.16.1.5 主机公钥发送成功!
172.16.1.81 主机公钥发送成功!
172.16.1.170 主机公钥发送成功!
5. 随机点菜菜单系统
###########################
菜品 价格
1. 五香牛肉 48元
2. 夫妻肺片 48元
3. 糖醋鲤鱼 68元
4. 红烧排骨 88元
5. 澳洲龙虾 398元
6. 帝王蟹 998元
7. 澳洲肥牛 198元
8. 北京烤鸭 888元
9. 战斧牛排 298元
0. 结束点菜 汇总
###########################
[root@db01 /service/scripts/day09]# cat while-4.sh
#!/bin/bash
#定义菜单
Menu() {
cat<<EOF
##############################
菜品 价格
1. 五香牛肉 58元
2. 夫妻肺片 48元
3. 糖醋鲤鱼 68元
4. 红烧排骨 88元
5. 澳洲龙虾 398元
6. 帝王蟹 998元
7. 澳洲肥牛 198元
8. 北京烤鸭 888元
9. 战斧牛排 298元
0. 结束点菜 汇总
##############################
EOF
}
>menu.log
echo "欢迎来到Linux脱产08期大酒店!很高兴为您服务!"
while true
do
Menu
read -p "请根据菜单点出你想吃的菜品:" Num
#编写case语句
case $Num in
1)
clear
echo "您点了一份五香牛肉,价格58元!"
echo -e "五香牛肉\t48 元" >>menu.log
;;
2)
clear
echo "您点了一份夫妻肺片,价格48元!"
echo -e "夫妻肺片\t48 元" >>menu.log
;;
3)
clear
echo "您点了一份糖醋鲤鱼,价格68元!"
echo -e "糖醋鲤鱼\t68 元" >>menu.log
;;
4)
clear
echo "您点了一份红烧排骨,价格88元!"
echo -e "红烧排骨\t88 元" >>menu.log
;;
5)
clear
echo "您点了一份澳洲龙虾,价格398元!"
echo -e "澳洲龙虾\t398 元" >>menu.log
;;
6)
clear
echo "您点了一份帝王蟹,价格998元!"
echo -e "帝王蟹\t998 元" >>menu.log
;;
7)
clear
echo "您点了一份澳洲肥牛,价格198元!"
echo -e "澳洲肥牛\t198 元" >>menu.log
;;
8)
clear
echo "您点了一份北京烤鸭,价格888元!"
echo -e "北京烤鸭\t888 元" >>menu.log
;;
9)
clear
echo "您点了一份战斧牛排,价格298元!"
echo -e "战斧牛排\t298 元" >>menu.log
;;
0)
echo "您结束了您的点餐!您点的菜品详情如下:"
awk '{print $1}' menu.log | sort |uniq -c | sort -rn | awk '{print "您点了"$1"份"$2"!"}'
awk '{print $2}' menu.log |xargs |tr ' ' '+' |bc | awk '{print "您点的菜品总价格为:"$1"元!"}'
exit
;;
*)
echo "您点的菜品!我们酒店暂时没有!请重新点餐!"
continue
esac
done
6. while计算题
1. 使用while循环计算1-100之间的和
[root@db01 /service/scripts/day09]# cat while-5.sh
#!/bin/bash
a=1
while [ $a -le 100 ]
do
Sum=$(( $Sum + $a ))
let a++
done
echo $Sum
2. for循环实现计算1-100之间的和
[root@db01 /service/scripts/day09]# cat for-1.sh
#!/bin/bash
for i in {1..100}
do
Sum=$(( $Sum + $i ))
done
echo $Sum
3. 生成0-100之间的随机数,并相加,直到结果大于1000,输出相加的结果
[root@db01 /service/scripts/day09]# cat while-6.sh
#!/bin/bash
while true
do
#生成0-100之间的随机数
Ran=$(( $RANDOM % 101 ))
Sum=$(( $Sum + $Ran ))
if [ $Sum -gt 1000 ];then
echo $Sum
exit
fi
done
[root@db01 /service/scripts/day09]# cat for-2.sh
#!/bin/bash
for i in {1..1000}
do
Ran=$(( $RANDOM % 101))
Sum=$(( $Sum +$Ran ))
if [ $Sum -gt 1000 ];then
echo $Sum
exit
fi
done
[root@db01 /service/scripts/day09]# cat for-3.sh
#!/bin/bash
for ((i=1;;i++))
do
Ran=$(($RANDOM % 101))
Sum=$(( $Sum +$Ran ))
if [ $Sum -gt 1000 ];then
echo $Sum
exit
fi
done
4. 生成0-100之间的随机数,并相加,直到结果大于1000,输出相加的结果,并判断最后一个随机数是否被3整除
[root@db01 /service/scripts/day09]# cat while-7.sh
#!/bin/bash
while true
do
#生成0-100之间的随机数
Ran=$(( $RANDOM % 101 ))
Sum=$(( $Sum + $Ran ))
if [ $Sum -gt 1000 ];then
echo $Sum
break
fi
done
Remainder=$(( $Ran % 3 ))
if [ $Remainder -eq 0 ];then
echo "最后一个随机数${Ran}能够被3进行整除!"
else
echo "最后一个随机数${Ran}不能够被3进行整除!"
fi
[root@db01 /service/scripts/day09]# cat for-4.sh
#!/bin/bash
for (( i=1;;i++ ))
do
#生成0-100之间的随机数
Ran=$(( $RANDOM % 101 ))
Sum=$(( $Sum + $Ran ))
if [ $Sum -gt 1000 ];then
echo $Sum
break
fi
done
Remainder=$(( $Ran % 3 ))
if [ $Remainder -eq 0 ];then
echo "最后一个随机数${Ran}能够被3进行整除!"
else
echo "最后一个随机数${Ran}不能够被3进行整除!"
fi
5. 计算100以内的所有3的倍数的数字的和
[root@db01 /service/scripts/day09]# cat for-5.sh
#!/bin/bash
for i in $(seq 0 3 100 )
do
Sum=$(( $Sum + $i ))
done
echo $Sum