• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

Shell脚本编程学习——while循环简单脚本案例【显哥出品,必为精品】

Shell编程 lixian 5年前 (2020-04-29) 1774次浏览 2个评论 扫描二维码
文章目录[隐藏]

一、随机点名脚本

1.脚本代码

[root@xian /server/scripts]# cat stdent.sh 
#!/bin/bash
# File Name: stdent.sh
# Author: lixian
#######################
Count=$(cat stdent.txt |wc -l)
read -p "请输入需要循环名单的次数:" Num
#判断输出的次数是否为整数
if [[ ! $Num =~ ^[0-9]+$ ]];then
    echo "你输入的不正确!"
    exit
fi
i=1
while [ $i -le $Num ]
do
    
    Ran=$(( $RANDOM % $Count + 1 ))
    #循环打印人员名单
    sed -n "${Ran}p" stdent.txt
    sleep 0.5
    let i++
done
Name=$(sed -n "${Ran}p" stdent.txt)
echo -e "今晚翻牌:\033[42;37m $Name \033[0m"

2.执行结果

[root@xian /server/scripts]# sh stdent.sh 
请输入需要循环名单的次数:3
大桥未久
早乙女露依
早乙女露依
今晚翻牌: 早乙女露依 
[root@xian /server/scripts]# sh stdent.sh 
请输入需要循环名单的次数:4
天海翼
波多野结衣
早乙女露依
波多野结衣
今晚翻牌: 波多野结衣 
[root@xian /server/scripts]# sh stdent.sh 
请输入需要循环名单的次数:7
椎名由奈
波多野结衣
天海翼
大桥未久
樱井莉亚
小川阿佐美
波多野结衣
今晚翻牌: 波多野结衣 

二、猜数字的脚本

1.业务需求

1. 随机输出一个1-100之间的数字 guess

2. 执行脚本时,提示用户输入一个数字

3. 判断用户输入的数字是否为正整数

4. 判断用户输入的数字跟随机数进行比较

5. 大了则输出输入的数字大了,小了就输入小了

6. 猜对了则退出 错误继续猜

7. 统计总共猜了多少次 ,错误多少次

2.脚本代码

[root@xian /server/scripts]# cat guess_num.sh 
#!/bin/bash
# File Name: guess_num.sh
# Author: lixian
#######################
#随机产生一个数字
num=$(echo $((RANDOM % 100 + 1 )))
i=0
while true 
do
    #提示用户输入一个数字
    read -p "请输入你猜的数字:" Guess
    #判断用户输入的是否是整数
    if [[ ! $Guess =~ ^[0-9]+$ ]];then
        echo "请输入整数!"
        continue
    fi         
    if [ $Guess -eq 0 -o $Guess -gt 100 ];then
        echo "你输入的数字不能为0或者不能大于100!"
        continue
    fi
    if [ $Guess -gt $num ];then
        echo "你猜的太大了"
    elif [ $Guess -lt $num ];then
        echo "你猜的太小了"
    else
        echo "你猜对了"
        break
    fi
    let i++
done
    echo "你一共猜了$(( $i + 1 ))次!"

3.执行结果

[root@xian /server/scripts]# sh guess_num.sh 
请输入你猜的数字:50
你猜的太大了
请输入你猜的数字:0
你输入的数字不能为0或者不能大于100!
请输入你猜的数字:30
你猜的太小了
请输入你猜的数字:40
你猜的太小了
请输入你猜的数字:46
你猜的太小了
请输入你猜的数字:48
你猜的太小了
请输入你猜的数字:49
你猜对了
你一共猜了6次!

三、分发公钥的脚本

1.业务需求

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. 返回结果

2.脚本代码

[root@xian /server/scripts]# cat key.sh 
#!/bin/bash
# File Name: key.sh
# Author: lixian
#######################
#引用函数库
[ -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
    echo '------------------------------------'
else
    rm -rf /root/.ssh &>/dev/null
    #生成密钥对
    ssh-keygen -t rsa -f /root/.ssh/od_rsa -N "" &>/dev/null
    if [ $? -eq 0 ];then
        action "密钥对生成成功!" /bin/true
        echo '------------------------------------'
    else
        action "密钥对生成失败!" /bin/false
        exit
    fi
fi
#批量探测网段内的主机是否存活
i=1
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/{print $2}')
            if [ $Status == "open" ];then
                action "${IP}主机的远程连接端口是开放的!" /bin/true
                sshpass -p1 ssh-copy-id -o "StrictHostKeyChecking no"  -i /root/.ssh/id_rsa.pub ${IP} &>/dev/null
                if [ $? -eq 0 ];then
                    action "${IP}主机公钥发送成功!" /bin/true
                    echo '------------------------------------'
                else
                    action "${IP}主机公钥发送失败!" /bin/false
                fi
            else
                action "${IP}主机的远程连接端口是关闭的!无法进行分发公钥!" /bin/false
            fi
        fi
    }&
    let i++
    sleep 0.5
done
wait

3.执行结果

[root@xian /server/scripts]# sh key.sh 
密钥对已存在!                                             [  成功  ]
------------------------------------
172.16.1.7主机是存活的!                                   [  成功  ]
172.16.1.7主机的远程连接端口是开放的!                     [  成功  ]
172.16.1.7主机公钥发送成功!                               [  成功  ]
------------------------------------
172.16.1.51主机是存活的!                                  [  成功  ]
172.16.1.51主机的远程连接端口是开放的!                    [  成功  ]
172.16.1.51主机公钥发送成功!                              [  成功  ]
------------------------------------
172.16.1.99主机是存活的!                                  [  成功  ]
172.16.1.99主机的远程连接端口是开放的!                    [  成功  ]
172.16.1.99主机公钥发送成功!                              [  成功  ]
------------------------------------

四、菜单金额结算系统

1.脚本代码

[root@xian /server/scripts]# cat menu_jiudian.sh 
#!/bin/bash
# File Name: menu_jiudian.sh
# Author: lixian
#######################
#定义函数菜单

menu() {
    cat<<EOF
+-----------------------------+
|                             |
|    1. 小川阿佐美 100元      |
|    2. 大桥未久 200元        |
|    3. 早乙女露依 250        |
|    4. 樱井莉亚 300元        |
|    5. 椎名由奈 400元        |
|    6. 波多野结衣 500元      |
|    7. 天海翼 600元          |
|    8. 邱老师 998元          |
|    9. 结束点菜              |
|                             |
+-----------------------------+
EOF
}


>cai.txt
echo ""


while true
do
    menu
    read -p "请开始你的选择:" Num
    if [[ ! $Num =~ ^[1-9]$ ]];then
        echo "请根据菜单表选择你喜欢的女忧!"
        continue
    fi
    case $Num in
        1)
            clear
            echo "你选择了小川阿佐美,价格100元!"
            echo "小川阿佐美 100 元" >>cai.txt
            ;;
        2)
            clear
            echo "你选择了大桥未久,价格200元!"
            echo "大桥未久 200 元" >>cai.txt
            ;;
        3)
            clear
            echo "你选择了早乙女露依,价格250元!"
            echo "早乙女露依 250 元" >>cai.txt
            ;;
        4)
            clear
            echo "你选择了樱井莉亚,价格300元!"
            echo "樱井莉亚 300 元" >>cai.txt
            ;;
        5)
            clear
            echo "你选择了椎名由奈,价格400元!"
            echo "椎名由奈 400 元" >>cai.txt
            ;;
        6)
            clear
            echo "你选择了波多野结衣,价格500元!"
            echo "波多野结衣 500 元" >>cai.txt
            ;;
        7)
            clear
            echo "你选择了天海翼,价格600元!"
            echo "天海翼 600 元" >>cai.txt
            ;;
        8)
            clear
            echo "你选择了邱老师,价格998元!"
            echo "邱老师 998 元" >>cai.txt
            ;;
        9)
            echo "你结束了选择!你的选择如下:"
            awk '{print $1}' cai.txt |sort | uniq -c | sort -rn | awk '{print "你选择了"$1"次"$2"按摩师!"}'
            echo "你本次按摩消费金额如下(赶快买单):"
            awk '{print $2}' cai.txt |xargs | tr ' ' '+' | bc | awk '{print "消费总价格为:"$1"元!"}'
            exit
    esac
done

2.执行结果

[root@xian /server/scripts]# sh menu_jiudian.sh 

+-----------------------------+
|                             |
|    1. 小川阿佐美 100元      |
|    2. 大桥未久 200元        |
|    3. 早乙女露依 250        |
|    4. 樱井莉亚 300元        |
|    5. 椎名由奈 400元        |
|    6. 波多野结衣 500元      |
|    7. 天海翼 600元          |
|    8. 邱老师 998元          |
|    9. 结束点菜              |
|                             |
+-----------------------------+
请开始你的选择:3
你选择了邱老师,价格998元!
+-----------------------------+
|                             |
|    1. 小川阿佐美 100元      |
|    2. 大桥未久 200元        |
|    3. 早乙女露依 250        |
|    4. 樱井莉亚 300元        |
|    5. 椎名由奈 400元        |
|    6. 波多野结衣 500元      |
|    7. 天海翼 600元          |
|    8. 邱老师 998元          |
|    9. 结束点菜              |
|                             |
+-----------------------------+
请开始你的选择:9
你结束了选择!你的选择如下:
你选择了5次小川阿佐美按摩师!
你选择了3次樱井莉亚按摩师!
你选择了2次波多野结衣按摩师!
你选择了1次邱老师按摩师!
你本次按摩消费金额如下(赶快买单):
消费总价格为:3398元!

五、while循环简单计算脚本

1.计算100以内的所有3的倍数的数字的和

[root@xian /server/scripts]# cat for-3-bei.sh 
#!/bin/bash
# File Name: for-3-bei.sh
# Author: lixian
#######################
for i in $(seq 0 3 100)
do
    Sum=$(( $Sum + $i ))
done
echo "$Sum"
[root@xian /server/scripts]# sh for-3-bei.sh 
1683

2.使用while循环和for循环计算1-100之间的和

[root@xian /server/scripts]# cat while-1-100.sh 
#!/bin/bash
# File Name: while-1.sh
# Author: lixian
#######################
a=1
while [ $a -le 100 ]
do
    Sum=$(( $Sum + $a ))
    let a++
done
echo $Sum
[root@xian /server/scripts]# sh while-1-100.sh 
5050
[root@xian /server/scripts]# cat for-1-100.sh 
#!/bin/bash
# File Name: for-1-100.sh
# Author: lixian
#######################
for i in {1..100}
do
    Sum=$(( $Sum + $i ))
done
echo $Sum
[root@xian /server/scripts]# sh for-1-100.sh 
5050

3.生成0-100之间的随机数,并相加结果大于1000,输出相加的结果,并判断最后一个随机数是否被3整除

[root@xian /server/scripts]# cat suiji.sh 
#!/bin/bash
# File Name: suiji.sh
# Author: lixian
#######################
while true
do
    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@xian /server/scripts]# sh suiji.sh 
1035
最后一个随机数98不能够被3进行整除!
[root@xian /server/scripts]# sh suiji.sh 
1018
最后一个随机数57能够被3进行整除!
[root@xian /server/scripts]# sh suiji.sh 
1002
最后一个随机数44不能够被3进行整除!

本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:Shell脚本编程学习——while循环简单脚本案例【显哥出品,必为精品】
喜欢 (0)

您必须 登录 才能发表评论!

(2)个小伙伴在吐槽
  1. I may need your help. I tried many ways but couldn't solve it, but after reading your article, I think you have a way to help me. I'm looking forward for your reply. Thanks.
    gate io2023-06-01 04:57
  2. 波多野结衣你不适合,还是刘悦老师适合你
    匿名2022-04-06 17:08