Linux9-24

while循环

语法结构

while  条件;

do

        循环体

done

        while循环必须写退出条件,否则就是死循环

案例:计算100以内整数的和

#!/bin/bash

sum=0

num=0

while  [ $num  -lt  101 ];

do

        sum=$[$sum+$num]

        num=$[$num+1]

done

echo  $sum

while处理文件

while  read  变量名

do

        循环体

done<文件路径

#!/bin/bash

while  read  line

do

        echo  $line

done

案例:重复提示用户输入字符串,无论输入什么字母,都转换成小写并显示,如果用户输入quit则退出

#!/bin/bash

while  true;

do

        read  -p  "enter:" str

        str1=`echo $str | tr "A-Z" "a-z"`

        if  [ "$str1"  == "quit" ];then

                exit

        else

                echo  $str1

        fi

done

案例:显示所有uid和gid均为偶数的用户

#!/bin/bash

while  read  line

do

        uid=`echo  $line | awk  -F  ":"  '{print  $3}'`

        gid=`echo  $line | awk  -F  ":"  '{print  $4}'`

        name=`echo  $line | awk  -F  ":"  '{print  $1}'`

        if  [ $[$uid%2] -eq 0 ] && [ $[$gid%2] -eq 0 ];then

                echo  $name

        fi

done</etc/passwd

循环控制:

        break:终止循环

        continue:跳过本轮循环,进入下一轮循环

案例:提示用户输入一个文件,如果文件不存在,就让用户重新输入,直到输入正确为止,则退出,quit则退出

#!/bin/bash

while  true;

do

        read  -p  "enter a file:" file

        [ $file == "quit" ] && exit 0

        if  [ -e $file ];then

                echo  "$file 找到了"

                break

        else

                echo  "$file 找不到"

        fi

done

bash随机数

        /dev/random

                0-32767

        /dev/urandom

echo  $RANDOM

echo  $[$RANDOM%100]        输出一个100以内的随机数

案例:

使用RANDOM生成10个100以内的随机数,并找出最大的数放在第一位

#!/bin/bash

for  i  in  {0..9};

do

        num=$[$RANDOM%100]

        list[$i]=$num

done

echo  "原数组:${list[*]}"

for  i  in {1..9};

do

        t=${list[0]}

        if  [ $t  -lt  ${list[$i]} ];then

                list[0]=${list[$i]}

                list[$i]=$t

        fi

done

echo  ":${list[*]}"

echo  "最大值:${list[0]}"

案例:猜数字游戏,随机生成一个100以内的随机数,让用户输入数字,如果用户输入的数字和生成的随机数不同,则让用户重新输入,知道猜对为止

#!/bin/bash

sc=$[$RANDOM%100+1]

while true;

do

        read  -p  "请输入一个数字:" num

        if  [ $num  =~  "^[0-9]+$" ];then

                if  [ $num -eq $sc ];then

                        echo "恭喜,猜对了"

                        exit

                elif  [ $num -lt $sc ];then

                        echo "猜小了"

                else

                        echo "猜大了"

                fi

        else

                echo "请输入100以内的纯数字"

        fi

done

case语句

case  变量名  in

样式1)

        语句;;

样式2)

        语句;;

样式3)

        语句;;

样式n)

        语句;;

esac

样式:

        a|b:a或者b

        *:任意长度的任意字符

        ?:单个字符

        [  ]:范围匹配

        [字符集]

案例:

提示用户输入一个字符

判断字符是数字类型还是字符串或者特殊符号

输入quit则退出

#!/bin/bash

read  -p  "enter:" str

case  $str in

        [[:digit:]])

                echo  "数字";;

        [[:alpha:]])

                echo  "字母";;

        [[:punct:]])

                echo "符号";;

        quit)

                echo "bye"
                exit;;

        *)

                echo "其他"

esac

练习:

1.
石头剪刀布:
玩家和系统猜拳:
提示玩家出拳,
玩家赢提示,PC-win
电脑赢提示,NPC-win
平局提示,P-J

#!/bin/bash
while true;
do
        read -p "0:石头 1:剪刀 2:布 3:退出游戏 请您输入数字出拳:" num
        dn=$[$RANDOM%3]
        if [ $num -eq 0 ] && [ $dn -eq 1 ];then
            echo "玩家赢"
        elif [ $num -eq 1 ] && [ $dn -eq 2 ];then
            echo "玩家赢"
        elif [ $num -eq 2 ] && [ $dn -eq 0 ];then
            echo "玩家赢"
        elif [ $num -eq $dn ];then
            echo "平局"
        elif [ $num -eq 3 ];then
            echo "再见"
            exit 0
        else
            echo "系统赢"
        fi
done

2.计算三个文件/etc/passwd /etc/shadow /etc/group钟,一共有多少行、多少单词、多少个字符

#!/bin/bash
hang=0
dc=0
zf=0
for i in /etc/passwd /etc/shadow /etc/group;
do
    h=`cat $i | wc -l`
    d=`cat $i | wc -w`
    z=`cat $i | wc -c`
    hang=$[$hang+$h]
    dc=$[$dc+$d]
    zf=$[$zf+$z]
done
echo "行$hang"
echo "单词$dc"
echo "字符$zf"

3.输出100以内所有的偶数。(三种方法实现)

#!/bin/bash
for i in `seq 2 2 100`;
do
    echo $i
done


#!/bin/bash
for i in {1..100};
do
    if [ $[$i%2] == 0 ];then
        echo $i
    fi
done


#!/bin/bash
i=0
while [ $i -lt 101 ];
do
    echo $i
    i=$[$i+2]
done

4.求100以内偶数的和

#!/bin/bash
num=0
for i in {1..100};
do
    if [ $[$i%2] == 0 ];then
        num=$[$num+$i]
    fi
done
echo $num

5.让用户输入两个数字,判断两个数字哪个大,哪个小?
要求:如果用户输入了非数字或者空,要求用户重新输入

#!/bin/bash
read -p "请输入第一个数值:" n1
read -p "请输入第二个数值:" n2
n1=`echo $n1 | grep -E ^"[[:digit:]]+"$`
n2=`echo $n2 | grep -E ^"[[:digit:]]+"$`
if [[ $n1 =~ [[:digit:]] ]] && [[ $n2 =~ [[:digit:]] ]];then
    if [ $n1 -eq $n2 ];then
        echo "两个数值相等"
    elif [ $n1 -gt $n2 ];then
        echo "$n1 大,$n2 小"
    else
        echo "$n2 大,$n1 小"
    fi
else
    echo "请输入正确数值"
fi

#!/bin/bash
read -p "请输入第一个数值:" n1
read -p "请输入第二个数值:" n2
if [[ $n1 =~ ^[[:digit:]]+$ ]] && [[ $n2 =~ ^[[:digit:]]+$ ]];then
    if [ $n1 -eq $n2 ];then
        echo "两个数值相等"
    elif [ $n1 -gt $n2 ];then
        echo "$n1 大,$n2 小"
    else
        echo "$n2 大,$n1 小"
    fi
else
    echo "请输入正确数值"
fi


6.让用户输入一个成绩,判断成绩的等级,等级如下
成绩大于等于90,输出A
成绩大于等于80,小于90,输出B
成绩大于等于70,小于80,输出C
成绩小于70,输出D
要求:用至少2钟方法实现

#!/bin/bash
read -p "请输入您的成绩:" cj
if [ $cj -lt 101 ];then
    case $cj in
        [9][0-9]|100)
            echo "A";;
        [8][0-9])
            echo "B";;
        [7][0-9])
            echo "C";;
        *)
            echo "D";;
    esac
else
    echo "请输入1-100的成绩"
fi

#!/bin/bash
read -p "请输入您的成绩:" cj
if [ $cj -lt 101 ];then
    if [ $cj -gt 89 ];then
        echo "A"
    elif [ $cj -gt 79 ];then
        echo "B"
    elif [ $cj -gt 69 ];then
        echo "C"
    elif [ $cj -lt 70 ];then
        echo "D"
    fi
else
    echo "请输入0-100的成绩"
fi

7. 让用户输入账号(admin)和密码(123456),如果用户输入了错误的选择,则要
求用户重新输入,但是最多重新输入三次,错误次数超过3次后,自动退出。

#!/bin/bash
cis=0
while true;
do
    if [ $cis -lt 3 ];then
        read -p "请输入您的用户名:" user
        read -p "请输入您的密码:" passwd
        if [ $user == "admin" ] && [ $passwd == "123456" ];then
            echo "登陆成功"
            break
        else
            cis=$[$cis+1]
            echo "用户名或密码错误,请重新输入"
            continue
        fi
    else
        echo "错误次数已达3次"
        exit
    fi
done

8.让用户输入一个文件,如果文件存在,并且文件属主是root输出ok,否则输出error

#!/bin/bash
read -p "请输入一个文件名" file
if [ -e $file ];then
    shuzhu=`ls -l $file | awk -F " " '{print $3}'`
    if [[ $shuzhu == "root" ]];then
        echo "ok"
    else
        echo "error"
    fi
else
    echo "文件不存在"
fi

9.让用户输入一个用户名,判断这个用户uid和gid是否都是大于500,是就输出ok,否则输出error

#!/bin/bash
read -p "请输入一个用户名:" user
uid=`id -u $user`
gid=`id -g $user`
if [ $uid -gt 500 ] && [ $gid -gt 500 ];then
    echo "ok"
else
    echo "error"
fi

10.让用户输入一个数字,判断这个数字是否为偶数

#!/bin/bash
read -p "请输入一个数字:" num
if [ $[$num%2] == 0 ];then
    echo "this is 偶数"
else
    echo "this is 奇数"
fi


11.让用户输入一个文件,如果文件有空白行或者注释行,输出ok,否则输出error

#!/bin/bash
read -p "请你输入一个文件:" file
num=`cat $file | egrep ^"#|$" | wc -l`
if [ $num -gt 0 ];then
    echo "ok"
else
    echo "error"
fi

12.写个商店选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150
元,袜子50元),一家店可复购,每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继
续逛的话进行购物车结算总额,输出购物总额和逛了几家店

#!/bin/bash
dianpu=1
num=0
while true;
do
    echo "欢迎来到第 $dianpu 家店铺"
    read -p "1.衣服500元,2.裤子400元,3.鞋子350元,4.帽子150元,5.袜子50元,6.不买,请输入您要购买的商品序号:" gwc
    case $gwc in
        "1")
            num=$[$num+500]
            read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
            if [ $yn -eq 1 ];then
                dianpu=$[$dianpu+1]
                continue
            else
                echo "本次逛了 $dianpu 家店,共消费$num元"
                break
            fi
        ;;
        "2")
            num=$[$num+400]
            read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
            if [ $yn -eq 1 ];then
                dianpu=$[$dianpu+1]
                continue
            else
                echo "本次逛了 $dianpu 家店,共消费$num元"
                break
            fi
        ;;
        "3")
            num=$[$num+350]
            read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
            if [ $yn -eq 1 ];then
                dianpu=$[$dianpu+1]
                continue
            else
                echo "本次逛了 $dianpu 家店,共消费$num元"
                break
            fi
        ;;
        "4")
            num=$[$num+150]
            read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
            if [ $yn -eq 1 ];then
                dianpu=$[$dianpu+1]
                continue
            else
                echo "本次逛了 $dianpu 家店,共消费$num元"
                break
            fi
        ;;
        "5")
            num=$[$num+50]
            read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
            if [ $yn -eq 1 ];then
                dianpu=$[$dianpu+1]
                continue
            else
                echo "本次逛了 $dianpu 家店,共消费$num元"
                break
            fi
        ;;
        "6")
            read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
            if [ $yn -eq 1 ];then
                dianpu=$[$dianpu+1]
                continue
            else
                echo "本次逛了 $dianpu 家店,共消费$num元"
                break
            fi
        ;;
        esac
done

Linux系统中,要为特定用户的登录设置有效期,通常需要修改`/etc/shadow`文件,因为这是存储用户密码和账户过期信息的地方。但是请注意,编辑`/etc/shadow`文件需要超级用户权限,并且对于大多数日常操作来说并不推荐直接修改,因为它涉及到系统的安全性。 如果你确定想要将“班长”用户的有效期设为2024年9月24日失效,你可以按照以下步骤操作: 1. 打开终端并以root身份登录: ```bash sudo su - ``` 2. 使用文本编辑器打开`/etc/shadow`文件,例如使用nano编辑器: ```bash nano /etc/shadow ``` 3. 寻找“班长”用户的行,它通常格式为: ``` username:$6$hash$other_info:18575:0:99999:7::: ``` 其中,前两个字段是你想找的用户名,`18575`是最后一次登录以来的天数,`0`是当前剩余登录尝试次数,`99999`是最大失败登录尝试次数,后面的星号(`*`)代表密码,而`:::`就是过期时间。 4. 将过期时间部分设置为`2024-09-24`对应的Unix时间戳。这通常是基于日期加上当前时间戳(如果是从现在开始算),或者直接输入对应的时间戳。假设我们想从现在开始计算,可以这样做: - 首先,获取当前的Unix时间戳(秒级): ```bash echo $(( $(date +%s) + (24*60*60*365))) # 因为一年有365天,这里只考虑自然年,闰年会稍有偏差 ``` - 然后,替换`/etc/shadow`中的过期时间,例如假设得到的是1695170400(即2024年9月24日零点的Unix时间戳): ```bash username:$6$hash$other_info:18575:0:99999:7:::1695170400 ``` 5. 保存并退出文件: ```bash Ctrl+X,然后 Y,回车确认保存 ``` 6. 最后,更新密码数据库以应用更改: ```bash chpasswd ``` 完成以上步骤后,“班长”的账号将在2024年9月24日零点自动失效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值