shell编程循环语句小实验

301 阅读2分钟

1.实验一

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

#!/bin/bash
sum=0   //定义一个循环变量sum,初始值为0
i=1     
until [ $i -gt 100 ]  //只要大于大于100就会跳出循环
do
    sum=$[sum + i]    //每次循环sum都会加一次i
    let i++           //每次i自加1
done
    echo $sum         //输出1-100的所有的整数和

image.png

  • 执行结果

image.png

2.实验二

提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和

#!/bin/bash
read -p "请输入一个整数(1~100):" num  //输入提示信息,自定义变量num
sum=0      //定义一个循环变量sum,初始值为0
i=1
until [ $i -gt $num ]    //只要i大于变量num就会跳出循环
do
	sum=$(($sum + $i))  //每次循环sum都会加一次i
	let i++             //每次i自加1
done
	echo $sum   //输出自定义变量num之前的所有的整数和
  • 执行结果

image.png

3.实验三

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

#!/bin/bash
j=0  //定义一个奇数和
for i in {1..100..2}   //是要for循环i的取值范围在1到100之间,步长为2,遍历循环
do
  j=$[$i+$j]  //每次奇数和j每次都会加+i
done
  echo "奇数和为:$j "  //输出奇数和
o=0  //定义一个偶数和
for a in {0..100..2}  //是要for循环a的取值范围在2到100之间,步长为2,遍历循环
do
  o=$[$a+$o]  //每次奇数和j每次都会加+a
done
  echo "偶数和为:$o "  //输出偶数和
  • 执行结果

image.png

4.实验四

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

#!/bin/bash
for username in $(cat /ky22/day2/user.txt)  //把cat /ky22/day2/user.txt文件输出的结果输出到定义的变量username里
do
        grep "^$username:" /etc/passwd &> /dev/null  //过滤文件/ect/passwd以定义变量username开头的一行内容
        if [ $? = 0 ];then  //如果上一次命令执行结果的返回值是0的话,会输出用户已存在
                echo "${username}用户已存在"
                res=$(cat /etc/shadow | grep $username | awk -F: '{print $2}')  
                //把cat /etc/shadow | grep $username | awk -F: '{print $2}输出的结果赋给res
                //把cat /etc/shadow输出的结果用管道符交给后面处理过滤出来用户名的这一行,再使用awk过滤出来这一行的第二个位置变量
                if [ "$res" == "!!" ] || [ -z "$res" ];then  //如果res等于!!或为空
                   read -p "${username}用户没有密码,请输入密码:" pass  //就会提示输入密码
                   echo "$pass" | passwd --stdin $username  &> /dev/null  //设置密码
                fi
        else  //否则就会创建新的用户
                echo "用户不存在,正在创建${username}用户......"
                useradd $username &> /dev/null
                a=1
                while [ $a -eq 1 ]  //当a=1时
                do
                read -p "请设置用户$username 的密码:" passwd1  //输入密码
                read -p "请再次输入用户$username 的密码:" passwd2  //确认密码
                if [ "$passwd1" == "$passwd2" ];then //如果输入的两个密码一致的话,就会添加密码,否则就会让你重新输入,直到一致为止
                        echo $passwd1 | passwd --stdin $username  &> /dev/null
                        let a++
                else
                        echo "密码设置不一致"
                fi
                done
                echo "$username"用户和密码创建成功
        fi
done
  • 执行结果

image.png

5.实验五

检测指定范围主机是否通信,并将通信的主机ip输出到文件host_ip中

#!/bin/bash
for ((i=0;i<=254;i++)) //给变量赋值、取值范围和迭代范围
do
{  //{...}& 代表是将每个循环操作的进程放到后台执行,且后台不区分前后顺序
        ping -c 3 -w 3 172.16.100.$i &> /dev/null   //ping 172.16.100.0段所有IP
        if [ $? -eq 0 ];then  //如果返回值等于0,输出is online
                echo "172.16.100.$i is online" >> /opt/host_ip
        fi
}&
done
wait  //wait命令用于等待上面所有后台程序都执行完毕后再执行后面的shell语句
cat /opt/host_ip

  • 执行结果

image.png

6.实验六

用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警

#!/bin/bash
mima=123456  //正确密码
for i in {1..3}  //密码次数取值范围,超过三次就会直接退出
do
  read -p "输入密码:" ps  //提示信息
  if [ $ps = $mima ];then   //如果输入信息和正确密码一样就会输出正确
  echo "正确!"  
  exit
  fi
done
  echo "密码输入三次,无法进入!"  
  • 执行结果

image.png

7.实验七

使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数

#!/bin/bash
read -p "请输入一个0-255之间的整数:" num     
for i in {128,64,32,16,8,4,2,1}   //i的取值范围为:2的0次方 到 大小最接近255的2的次方
do

  a=$[ num - i ]  //定义一个变量a a=输入的值减去i的值
  if [ $a -lt 0 ];then   //如果输入的值减i小于0那么就输出0
    echo -n 0  不换行输出0
  else   //如果输入的值减i大于等于0那么就输出1

    echo -n 1  //不换行输出1
    num=$[ num - i ]   //给num赋新值为输入的值减去i的得数
  fi
done
echo""//换行输出
  • 执行结果

image.png