SHEll-while循环语句练习题

1.在系统的PATH环境变量中指定的目录中查找以"se"开头的文件

2.演示嵌套循环和条件语句的使用

#!/bin/bash
#用于演示嵌套循环和条件语句的使用
a=1
while [ $a -le 5 ]
do
    echo "外循环a等于$a"
    let a++
    b=0
    while [ $b -lt 5 ]
    do
        let b++
        echo -e "\t内循环b等于$b"
        if [ $b -eq 3 ];then
            continue
        fi
        echo -e "\t\tHelloWorld"
    done
done
################
首先定义了一个变量a,初始值为1。
然后进入一个while循环,条件是a小于等于5。
在循环内部,使用echo命令输出"外循环a等于$a"。
然后使用let命令将a加1。
接着定义了一个变量b,初始值为0。
进入另一个while循环,条件是b小于5。
在循环内部,使用let命令将b加1。
使用echo命令输出"\t内循环b等于$b"。
接下来使用if语句判断b的值是否等于3,如果是则执行continue语句跳过本次循环。
如果b的值不等于3,则输出"\t\tHelloWorld"。
最后结束内循环和外循环。

3.用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;若该用户不存在,提示用户输入密码,建立用户并设立其密码

#!/bin/bash

while read user; do
    if id -u "$user" >/dev/null 2>&1; then
#这段代码的意思是检查用户是否存在。id -u "$user"命令用于获取用户的用户ID,如果该命令执行成功,则表示用户存在。>/dev/null 2>&1是将标准输出和错误输出都重定向到/dev/null,即不显示任何输出信息。如果该命令执行失败,则会返回非零值,表示用户不存在。
        if [ -z "$(sudo passwd -S "$user" | grep -o ' LK ' || true)" ]; then#这段代码的意思是检查用户是否设置了密码。sudo passwd -S "$user"命令用于获取用户的密码状态信息,然后使用grep -o ' LK '命令从>
输出中提取出" LK "字符串,如果该字符串存在,则表示用户未设置密码。-z选项用于判断字符串是否为空,如果为空,则表示用户未设置密
码。
         echo "用户 $user 已存在,但未设置密码,请设置密码:"
            sudo passwd "$user"
        else
            echo "用户 $user 已存在"
        fi
    else
        echo "用户 $user 不存在,请输入密码以创建用户并设置密码:"
        sudo adduser "$user"
        sudo passwd "$user"
    fi
done < users.txt
#这段代码的意思是将users.txt文件中的每一行作为参数传递给while循环。done < users.txt表示从users.txt文件中读取每一行,并将其作
为参数传递给while循环

~                             


4.写个脚本实现 猜测0-999的随机价格,猜不中则一直猜

#!/bin/bash
#写个脚本实现 猜测0-999的随机价格,猜不中则一直猜

PRICE=$[RANDOM % 1000]
a=1
b=0
while [ $a -eq 1 ];
do
  read -p "请输入你猜测的价格(0-999):" NUM  
  let b++
  if [ $NUM -eq $PRICE ] && [ $b -le 5 ];then
    echo "恭喜!你猜中了!!"
    exit 0
  elif [ $NUM -gt $PRICE ] && [ $NUM -le 999 ];then
    if [ $b -lt 5 ];then
      echo "猜大了!!请重猜"
    else
      echo "真遗憾,猜测次数用完!"
      exit 1
    fi
  elif [ $NUM -le $PRICE ] && [ $NUM -ge 0 ];then
    if [ $b -lt 5 ];then
      echo "猜小了!!请重猜"
    else
      echo "真遗憾,猜测次数用完!"
      exit 2
    fi
  else
    echo "输入有误!请重新输入!!"
  fi
done

###############
首先定义了一个变量PRICE,使用RANDOM生成一个0-999之间的随机数。
定义了两个变量a和b,其中a初始值为1,b初始值为0。
进入while循环,条件是a等于1。
在循环内部,使用read命令提示用户输入猜测的价格,并将输入的值赋给变量NUM。
将变量b加1。
判断用户输入的价格是否等于PRICE,并且猜测次数小于等于5。如果是,则输出"恭喜!你猜中了!!"并退出脚本。
如果用户输入的价格大于PRICE且在0-999之间,则判断猜测次数是否小于5。如果是,则输出"猜大了!!请重猜";否则输出"真遗憾,猜测次数用完!"并退出脚本。
如果用户输入的价格小于PRICE且在0-999之间,则判断猜测次数是否小于5。如果是,则输出"猜小了!!请重猜";否则输出"真遗憾,猜测次数用完!"并退出脚本。
如果用户输入的价格不在0-999之间,则输出"输入有误!请重新输入!!"。
最后结束while循环。

5.批量添加用户 用户名称以stu开头,按数字顺序进行编号 一共添加20个用户,即stu1、stu2、……、stu20 初始密码均设为123456

#!/bin/bash
#批量添加用户 用户名称以stu开头,按数字顺序进行编号 一共添加20个用户,即stu1、stu2、……、stu20 初始密码均设为123456

i=1

while [ $i -le 20 ]
do
   useradd stu$i &> /dev/null
   echo 123456 | passwd --stdin stu$i > /dev/null
   echo "stu$i用户密码已创建完毕"
   let i++
done
###########
定义一个变量i,初始值为1。
进入while循环,条件是i小于等于20。
在循环内部,使用useradd命令添加用户,用户名为stu$i,并将输出重定向到/dev/null。
使用echo命令将密码123456传递给passwd命令,并使用--stdin选项指定输入密码的方式,同时将输出重定向到/dev/null。
输出提示信息"stu$i用户密码已创建完毕"。
将变量i加1。
最后结束while循环。

6.计算从1到100所有整数的和

#!/bin/bash
#计算从1到100所有整数的和

a=1
sum=0
read -p "请输入一个1到100的整数:" num
if [ $num -ge 1 ] && [ $num -le 100 ];then

  while [ $a -le $num ]
  do
    let sum+=a
    let a++

  done

  echo "1到100总和为$sum"

else
  echo "输入有误!"
fi
#############
定义一个变量a,初始值为1。
定义一个变量sum,初始值为0。
使用read命令提示用户输入一个1到100的整数,并将输入的值赋给变量num。
判断用户输入的数是否在1到100之间。如果是,则执行以下操作:
进入while循环,条件是a小于等于num。
在循环内部,将a加到sum上,并将a加1。
输出"1到100总和为$sum"。
如果用户输入的数不在1到100之间,则输出"输入有误!"。

7.求从1到100所有整数的偶数和、奇数和

#!/bin/bash
#求从1到100所有整数的偶数和、奇数和

a=1

jisum=0
ousum=0
while [ $a -le 100 ]
do
   b=$[a % 2]
   if [ $b -eq 0 ];then
     let ousum+=$a
   else
     let jisum+=$a
   fi
   let a++
done

echo -e "奇数和为 $jisum\n偶数和为 $ousum"
###########
定义一个变量a,初始值为1。
定义两个变量jisum和ousum,分别表示奇数和和偶数和,初始值均为0。
进入while循环,条件是a小于等于100。
在循环内部,使用取模运算符%计算a除以2的余数,将结果赋给变量b。
如果b等于0,则将a加到ousum上;否则将a加到jisum上。
将a加1。
最后输出"奇数和为 𝑗𝑖𝑠𝑢𝑚"和"偶数和为jisum"和"偶数和为ousum"。

8.每10秒检查系统内存使用率是否超过80%

#!/bin/bash
#每10秒检查系统内存使用率是否超过80%

while true
do
  memused=$(free | grep Mem | awk '{print $3}')
  memtotal=$(free | grep Mem | awk '{print $2}')

  usedpercent=$[memused * 100 / memtotal]

  if [ $usedpercent -ge 20 ];then
    echo "警告!当前系统内存使用率超过80%,当前使用率为 ${usedpercent}%"
  fi

  sleep 10
done

########
进入无限循环。
使用free命令获取当前系统内存使用情况,并使用grep和awk提取出已使用的内存量memused和总内存量memtotal。
计算当前内存使用率usedpercent。
如果usedpercent大于等于20(即80%),则输出警告信息"警告!当前系统内存使用率超过80%,当前使用率为 ${usedpercent}%"。
等待10秒后再次执行循环。

9.用while循环将一个200行的文件分割成多个50行的文件

#!/bin/bash
#用while循环将一个200行的文件分割成多个50行的文件


filepath=/root/day10/test.txt
#定义行数计数器变量
a=0
#定义文件序号变量
i=1

cat $filepath | while read line
do
  let a++
  #判断是否已经读入50行,满50行则文件序号+1
  c=$[a % 50]
  if [ $c -eq 0 ];then
    echo $line >> /root/day10/test${i}.txt
    let i++
  else
    echo $line >> /root/day10/test${i}.txt
  fi
done
#######
定义变量filepath为文件路径/root/day10/test.txt。
定义变量a为行数计数器,初始值为0。
定义变量i为文件序号,初始值为1。
使用cat命令读取文件内容,并使用while循环逐行处理。
在循环内部,将行数计数器a加1。
判断是否已经读入50行,如果是则文件序号i加1。
将当前行的内容追加到对应的文件中。
最后结束循环。

10.求裴波拉切数:1,1,2,3,5,8,13,21,34,55,89...,数列从第3项开始每一项等于前两项之和,打印前10个元素

#!/bin/bash

a=1
b=1
count=2

echo -n "$a $b "

while [ $count -lt 10 ]; do
    c=$((a + b))
    echo -n "$c "
    a=$b
    b=$c
    count=$((count + 1))
done

echo
####
#!/bin/bash:指定脚本使用的解释器为Bash。
a=1:将变量a赋值为1。
b=1:将变量b赋值为1。
count=2:将变量count赋值为2。
echo -n "$a $b ":输出变量a和b的值,不换行。
while [ $count -lt 10 ]; do:当count小于10时,执行循环体。
c=$((a + b)):计算a和b的和,并将结果赋值给变量c。
echo -n "$c ":输出变量c的值,不换行。
a=$b:将变量b的值赋给变量a。
b=$c:将变量c的值赋给变量b。
count=$((count + 1)):将count的值加1。
done:结束while循环。
echo:输出一个空行。

11. 将一个 0到255 之间的十进制数转换成8位数二进制数

#!/bin/bash

# 输入十进制数
echo "请输入一个 0 到 255 之间的十进制数:"
read num

# 转换为二进制数并输出
binary=""
while [ $num -gt 0 ]; do
    remainder=$((num % 2))
    num=$((num / 2))
    binary=${remainder}${binary}
######
在 Bash 脚本中,binary=${remainder}${binary} 这行代码是一个变量赋值操作,它做了以下几件事情:
${remainder}:这部分引用了名为 remainder 的变量的值。在这个上下文中,remainder 保存了十进制数除以 2 后的余数。
${binary}:这部分引用了名为 binary 的变量的值。binary 变量用于累积二进制表示,初始时为空字符串。
binary=${remainder}${binary}:这个赋值操作将 remainder 的值和 binary 的值连接起来,然后将结果重新赋值给 binary 变量。由于 remainder 被放在前面,这实际上将新的余数添加到了二进制表示的最前面。
这种操作是在构建二进制数的过程中常用的技巧。每次循环,你都会取得一个新的余数(当前十进制数除以 2 的结果),并将其放置在目前为止计算出的二进制数的前面。这样,你就得到了正确的二进制表示,因为二进制数的位是从右到左计算的,而我们是从一个十进制数的最高位开始除以 2,逐步向下进行。
done
binary_padded=$(printf "%08d" $binary)
echo "转换后的二进制数为:$binary_padded"
######
首先,使用 read 命令从用户输入中读取一个十进制数。
然后,使用 while 循环将该十进制数转换为二进制数。在每次循环中,计算当前数字除以 2 的余数,并将余数添加到二进制数的最前面。同时,将当前数字除以 2 的结果作为下一次循环的输入。
接着,使用 printf 命令将二进制数补齐为 8 位,不足的部分用 0 填充。
最后,输出转换后的二进制数。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

煤五千

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值