【LinuxShell】Shell编程之循环语句实验题汇总


实验一:求和(一)

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

#!/bin/bash
sum=0								#定义1~100总和sum为0
for((i=1;i<=100;i++))               #定义i从1开始循环,一直到100,i累加
do
   let sum+=$i                      #将i的值赋给sum,然后通过循环进行累加计算和
done
echo -e "1到100所有整数和为${sum}"		#输出sum值至屏幕上

实验二:求和(二)

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

read -p "请输入一个小于100的整数" num
if [[ $num -eq $num ]]
then
    if [[ $num -gt 100 ]]
    then
        echo "这个数字大于100了,请重新输入"
               exit
     elif [[ $num -eq 100 ]]
     then
         echo "这个数字和100相同,请重新输入"
     else
        for((i=0;i<=${num};i++))
        do
           let a+=$i
         done
    echo "1到${num}的整数和为: ${a}"
    fi
else
    echo "输入的不是数字请重新输入!"
    exit
fi

实验三:求和(三)

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

sum1=0
sum2=0
for((i=1;i<=100;i++))
do
   if [[ i%2 -eq 0 ]]
   then
      let sum1+=$i
   else
      let sum2+=$i
   fi
done
echo "从1到100所有整数的偶数和为${sum1},奇数和为${sum2}"

实验四:用户密码设置(一)

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

#!/bin/bash
for name in `cat /opt/user.txt`
do
  cat /etc/passwd | awk -F: '{print $1}' | grep $name &> /dev/null
  if [ $? -eq 0 ];then
    echo "$name 用户已存在!"
    res=$(cat /etc/shadow | grep $name | awk -F: '{print $2 }')
    if [ "$res" == "!!" -o "$res" == "*" ];then
      read -p "$name 用户没有设置密码,请输入密码:" pswd
      echo $pswd | passwd --stdin $name > /dev/null
    fi
  else 
    echo "用户不存在,正在创建$name 用户....."
    useradd $name 
    while true
    do
        read -p "请设置用户$name 的密码:" passwd1
   		read -p "请设置用户$name 的密码:" passwd2
    	if [ "$passwd1" =  "$passwd2"]
   		then
       		echo $passwd1 | passwd --stdin $user > /dev/null
        	break
     	else
        	echo "密码输入不一致,请重新输入"
     	fi
    done
  fi   
done

实验五:用户密码设置(二)

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

#!/bin/bash
ps=123456
for((i=1;i<=3;i++))
do
   read -p "请用户输入密码:" pwd
   if [[ $pwd -eq $ps ]]
   then
       echo "用户输入密码正确"
       exit
   else
       echo "密码输入不正确,请重新输入"
   fi
done
echo "密码连续输入错误3次"

实验六:用户密码设置(三)

编写能够自动生成一个6位随机密码的脚本

#!/bin/bash
str='1234567890'
for((i=1;i<=6;i++))
do
    a=$[RANDOM % ${#str}]
    tmp=${str:a:1}
    passwd=$passwd$tmp
done
echo "随机生成一个密码为:${passwd}"

实验七:IP地址(一)

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

#!/bin/bash
for ((i=100;i<=110;i++))
do
  ping -c 2 -w 3 192.168.145.$i &>/dev/null
  if [ $? -eq 0 ]
  then
    echo "192.168.145.$i" >>/opt/host_ip
  fi
done

实验八:IP地址(二)

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

#!/bin/bash
read -p "请输入0-255之间的数字:" num
for((i=1;i<=8;i++))
do
    a=$[num % 2]$a						
    let num=$[num / 2]
done                              
echo $a

实验九:IP地址(三)

将一个点分十进制格式的IP地址转换成点分二进制格式

比如 255.255.255.255 --> 11111111.11111111.11111111.11111111

#!/bin/bash
read -p "请输入一个点分十进制的ip地址:" ipadd
a=$(echo "$ipadd" | awk -F. '{print $1}')		#通过awk获取输入的ip地址的第一段
b=$(echo "$ipadd" | awk -F. '{print $2}')		#通过awk获取输入的ip地址的第二段
c=$(echo "$ipadd" | awk -F. '{print $3}')		#通过awk获取输入的ip地址的第三段
d=$(echo "$ipadd" | awk -F. '{print $4}')		#通过awk获取输入的ip地址的第四段
for i in {1..8}									#因为十进制转二进制是一段转8位,所以循环8次
do
    num1=$[a % 2]$num1                          #通过取余的方式获取二进制的8位数
    let a=$[a / 2]                              #余数倒排法
    num2=$[b % 2]$num2                          #通过取余的方式获取二进制的8位数
    let b=$[b / 2]
    num3=$[c % 2]$num3                          #通过取余的方式获取二进制的8位数
    let c=$[c / 2]
    num4=$[d % 2]$num4                          #通过取余的方式获取二进制的8位数
    let d=$[d / 2]
done
echo ${num1}.${num2}.${num3}.${num4}

实验十:文件(一)

编写能够按照每100行分割文件的脚本

a=0						#定义记录行数的变量
b=1						#定义分割的文件序号标识
IFS_OLD=$IFS				#先将IFS赋给IFS_OLD,作为临时修改IFS的值
IFS=$'\n'					#然后修改IFS的值为换行符
for i in $(cat abc.txt)
do 
	let a++                 	#记录行数
	c=$[a % 100]             	#每100行一分割,当余数不为零就不足100行
	if [ $c -eq 0 ];then   		#判断当余数是否为零,为0就正好100行,不为0就不足100行
	   echo $i >> abc.txt-$b 	#如果满20行,则分隔文件
	   let b++
	 else 
	    echo $i >> abc.txt-$b     #如果不满20行,则继续输出文件中
	 fi
done
IFS=$IFS_OLD

实验十一:文件(二)

假设/opt/test/ 目录中有多个重要文件,编写脚本使用 md5sum 命令一次性判别目录中的文件是否有发生过改动

#!/bin/bash
for file in $(ls /opt/test)                
do
    SUM_NOW=$(md5sum /opt/test/$file | awk '{print $1}')
    SUM_OLD=$(grep $file /root/md5sum.txt | awk '{print $1}')
    if [ $SUM_NOW" != "$SUM_OLD" ]
    then
        echo "$file 文件内容被改动!""
    fi
done

实验十二:文件(三)

输出环境变量PATH的目录所包含的所有可执行文件

#!/bin/bash
IFSB=$IFS
IFS=$IFS':'
for folder in $PATH
do
	echo $folder
	for file in $folder/*
	do
		if [ -f "${file}" ] && [ -x "${file}" ]
		then
			echo " $file"
		fi
	done
done
IFS=$IFSB

实验十三:文件(四)

执行命令 mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

#!/bin/bash

IFSB=$IFS
IFS=$IFS':' #保留原来IFS变量值的基础上增加:号分隔符

for folder in $PATH
do
  #输出环境变量所包含的目录	
  #echo $folder  
   #已使用:号将folder进行分割,然后查看环境变量目录下所包>含的文件
  for file in $(ls $folder)  
  do
 	 #判断是否为文>件和是否具有可执行权限时,需要使用绝对路径进行判断
    if [ -f "${folder}/${file}" ] && [ -x "${folder}/${file}" ];then  
      echo "     $file"
    fi
   done
done
IFS=$IFSB     

实验十四:购物

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

#!/bin/bash
#定义逛店次数变量 i
i=1
#定义购物总额变量 sum
sum=0
while true
do
	echo "来到第$i家商店门口"
	read -p "是否进入看看(yes/no)" doing
	until [ $doing = "no" ]
	do
		echo "1:衣服¥500"
		echo "2:裤子¥400"
		echo "3:鞋子¥350"
		echo "4:帽子¥150"
		echo "5:袜子¥50"
		echo "6:放弃购买"
		read -p "请选择需要购买的商品序列:" num
		case $num in
		1)
			echo "衣服购买成功"
			let sum+=500
			;;
		2)
			echo "裤子购买成功"
			sum=$[sum+=400]
			;;
		3)
			echo "鞋子购买成功"
			sum=$[sum+=350]
			;;
		4)
			echo "帽子购买成功"
			sum=$[sum+=150]
			;;
		5)
		    echo "袜子购买成功"
			sum=$[sum+=50]
			;;
		6)
			echo "放弃购买"
            ;;
		*)
		    echo "输入错误"
		esac
		read -p "是否继续在这家店购物(yes/no)" doing      
	done	

	read -p "是否继续逛街(yes/no)" going
	if [ $going = "yes" ]
	then
		let i++
	else
		break
	fi	
done
echo -e "一共经过$i家店。\n合计购物总价:$sum。"
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我的宝贝大唐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值