shell脚本知识点9

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





posted @   zbzSH  阅读(64)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示