shell脚本---循环例题

循环例题

用户类

批量建立用户

i=0

while [ "${i}" -le 20 ]
do

useradd stu${i}
  echo "123456" |passwd --stdin stu${i} &>/dev/null
  
  if [ $? -eq 0 ]
    then
    echo "用户 stu${i} 被建立"
  else
    echo "用户 stu${i} 建立失败"
  fi

let i++

done

批量删除用户

i=0

while [ "${i}" -le 20 ]
do

  userdel -r stu${i}
  let i++

done

批量给用户免交互改密码

for i in $(cat /opt/users.txt)
do

  useradd $i
  echo 123456 | passwd --stdin $i

done

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

for USER in $(cat /xunhuan/user.txt )
do

   #读取用户文件,验证改USER变量中的用户是否存在,有则返回0
  cat /etc/passwd |awk -F: '{ print $1 }'|grep "$USER" &>/dev/null   ###awk -F 文件使用分号作为分隔符
  if [  $?  -eq  0  ];
  
  then
    echo "该用户已存在"
    res=$(cat /etc/shadow |grep "$USER" |awk -F: '{print $2}')  ###判断用户们的密码是否存在,空或则是”!!“的情况,代表密码为空
    
    if [ "$res" = '!!' -o  -z "$res" ];
    
    then
      echo "该用户并未创建密码,开始创建密码"
      read -p "请输入 $USER  的密码:" key1
      read -p "请再次输入密码,进行确认:" key2
      [ "$key1"  =   "$key2"   ]
      if [ $? -eq 0   ];
      
        then
          echo $key1 |passwd   --stdin  $USER
        else 
          echo "两次密码输入不一致!"
      fi 
     
    else 
      echo "$USER 用户已经创建密码"
    fi
    
  else
    echo "该用户不存在,正在建立中。。。"
      useradd $USER
      read -p "请输入 $USER  的密码:" key1
      read -p "请再次输入密码,进行确认:" key2
      [ "$key1"  -eq  "$key2"   ]
      
      if [ $? -eq 0   ];
       then
         echo $key1 |passwd   --stdin  $USER
       else
         echo "两次密码输入不一致!"
       fi
       
    fi

done

计算类

计算从1加到100的值

方法一
sum=0

for i in {1..100}
do

  sum=$(($i+$sum))
  #let sum=$i+$sum    #每次循环内容计算变量i+sum的值赋值给sum,二选一

done 

echo $sum

方法二
sum=0

for ((i=0;i<=100;i++))
do

  sum=$[i+sum]

done

echo $sum

方法三
sum=0
i=1

while [ $i -le 100 ]; 
do

  sum=$((sum + i))
  i=$((i + 1))

done

echo $sum

方法四
sum=0
i=1
until [ $i -gt 100 ]; 
do
  sum=$((sum + i))
  i=$((i + 1))
done

echo $sum

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

num1=0                                   #偶数和的初始值
num2=0                                   #奇数和的初始值

for i in {1..100}
do

  if (( i % 2 == 0 )); 
  then 
    num1=$(($num1+i))
  else
    num2=$(($num2+i))
  fi

done

echo "1 到 100 中所有偶数的和为:$num1"
echo "1 到 100 中所有奇数的和为:$num2"

打印类

打印9*9乘法表

for  i  in  {1..9}   ### i 控制列
do
    for ((j=1; j<=i; j++))   ### j 控制行
    do
    
    echo -ne "$j*$i=$[ $i*$j ]\t"  ### j 为前一个数字, i为后面一共数字

    done

echo                   

done        

倒等腰三角形

for ((i=5; i>=1; i--))
do
    for ((j=1; j<=i; j++))
    do
    
        echo -n "* "
        
    done
    
    echo

done

等腰梯形

height=5  # 梯形的高度
width=10  # 梯形的宽度

for ((i=1; i<=height; i++)); 
do
  for ((j=1; j<=height-i; j++)); 
  do
    echo -n " "    ### 输出左侧空格
  done
  
  for ((k=1; k<=width; k++)); 
  do
  
    echo -n "*"   ### 输出梯形主体部分
    
  done
  
  echo ""    ### 换行
  width=$((width + 2))   ### 更新宽度

done

练习题

打印出某个目录下的所有文件

for file in /opt/*
do

  echo $file

done

利用 for 循环将多个文本文件内容合并为一个文件

for file in *.txt
do

  cat "$file" >> 1.txt

done

测试用户输入的某个32位网段是否可以ping通,且若可以ping通将此ip输出到文件host.txt中

read -p "请输入需要测试的网段,格式为(192.168.233.):" ip  ###ip为IP前三个数字
for i in {1..254}  ###i为IP最后一共数字----ip和i合为一体则为完整IP
do
{                                 #将{}内容当成一个整体
ping -c 2 -W 2 $ip$i &>/dev/null  #指定ping包为2个超时结束时间为2秒且将产生的内容全部放入null垃圾桶中,&符号表示错误输出也放入null中(不用再前台显示)
    if [ $? -eq 0 ]               #如果上一个循环执行的命令是正确的则$?返回0
      then
        echo "$ip$i  is  online"  
        echo $ip$i >> host.txt      #将if条件成立的ip追加到host.txt文件中
      else
        echo "$ip$i  is  offline"   #if添加判断不成立执行打印
    fi
}&                              #将循环成立的内容放入后台执行

done

wait                            #执行结束不等待直接退出
###不加{}&执行速度非常慢,而且要结束255次才能退出,加了之后相当于并行执行,提升了执行速度

计算器

while true
do
  read -p "请输入第一个整数:" num1
  read -p "请输入运算符:加(+);减(-);乘(*);除(/);求余(%):" fh
  read -p "请输入第二个整数:" num2
  if [ "$fh" == "+" ]        
    then
      echo "结果为:$(($num1 + $num2))"
      
    elif [ "$fh" == "-" ]
    then
      echo "结果为:$(($num1 - $num2))"
      
    elif [ "$fh" == "*" ]
    then
      echo "结果为:$(($num1 * $num2))"
      
    elif [ "$fh" == "/" ]
    then
      echo "结果为:$(($num1 / $num2))"
      
    elif [ "$fh" == "%" ]
    then
      echo "结果为:$(($num1 % $num2))"
      
    else
      echo "输入有误!"
      
  fi
  
done

猜价格游戏

p=`echo $[RANDOM%1000+1]`
t=1

while true
do

read -p "请输入商品的价格1-1000:" num
let t++

  if [ $num -eq $p ]
  then
    echo "恭喜你猜中了,实际价格是$p"
    echo "您一共猜了${t}次"
    break
    
  elif [ $num -gt $p ]
  then
    echo "您猜的价格高了" 
    
  else
    echo "您猜的价格低了"
    
  fi
  
done

猜数字游戏

num=`echo $[ RANDOM%100+1 ]`                       #$[RANDOM]是一个0-32767的随机数,%100+1除100取余+1表示生成0-100随机数
time=0                                             #定义猜对次数变量time初始值为0
for((;;))
do 
let time++                                         #每循环一次time变量自加1
read -p "请输入您猜测的数字,范围(1-100):" user
  if [ $user -eq $num ] 
  then 
    echo "您猜对了,您一共猜测了$time次" 
    break      
    
  elif [ $user -gt $num  ]   
  then
    echo "您猜大了,请往小猜"      
    
  elif [ $user -lt $num ]   
  then 
    echo "您猜小了,请往大猜"  
    
  fi   #if语句结束
  
done

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

i=1
psd=123456
while [ $i -le 3  ]   ###次数小于3
do
read -p "请输入验证密码:"  key
[ "$key" =  "$psd"     ]
  if [ $? -eq 0  ];
    then
    echo "密码输入正确!"
    
  else
    echo "输入错误!"    
    let i++
    
  fi
  
done
 
if [ $i -eq 4  ];
then
  echo "密码输出错误次数超过三次!已经锁定!"
  
else
  echo "密码输入正确!"  
  
fi

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

#把0~255的十进制整数转换成8位二进制数
read -p "请输入一个0~255的整数:" num
for i in 128 64 32 16 8 4 2 1
do
  NUM=$[num - i]
  
  if [ $NUM -lt 0 ];
  then
    echo -n 0
    
  else
    echo -n 1
    num=$[num - i]
    
  fi
  
done

echo

某山顶上有一颗香蕉树,一只猴子第一天从树上摘了若干根香蕉,当即就吃了一半,还不过瘾,
又多吃了一根。第二天猴子又将剩下的香蕉吃了一半,禁不住诱惑,又多吃了一根香蕉。
依此类推,每天都将剩余的香蕉吃一半后再多吃一根。到了第十天,猴子发现只剩一根香蕉了,
请问这只猴子在第一天总共摘了多少根香蕉?

假设一下,香蕉总数是X,第一天吃了一半,就是x/2,然后又多吃了一根,就是x/2-1。第二天就是(x/2-1)/2-1,依次类推

banana=1
for i in {1..9}
do

  banana=$[(banana+1)*2]
  
done

  echo $banana

购物—练习

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

sum=0
for ((;;)) #创建无限循坏的一种简写
do
 echo "1、衣服:500元"
 echo "2、裤子:400元"
 echo "3、鞋子:300元"
 echo "4、帽子:150元"
 echo "5、袜子:50元"

read -p "请选择您想要购买的商品:" a
case $a in

1)
  echo "您已购买了衣服500元"
  let sum+=500
;;

2)
  echo "您已购买了裤子400元"
  let sum+=400
;;

3)
  echo "您已购买了鞋子300元"
  let sum+=300
;;

4)
  echo "您已购买了帽子150元"
  let sum+=150
;;

5)
  echo "您已购买了袜子50元"
  let sum+=50
;;

*)
  echo "欢迎下次光临,您本次消费共计$sum元"
  break
esac

read -p "您选择继续购物还是结算购物车?(y/n)" b

if [ $b = y ] ; 
then
  continue
  
elif [ $b = n ] ; 
then
  echo "欢迎下次光临,您本次购物共计消费$sum元"
  break
  
else
  echo "请您正确输入"     
  
fi

done

进阶

逛淘宝选购商品,
每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),
每次选购完或不买都会提示用户是否继续购买商店
如果不再继续逛的话进行购物车结算总额。
只有2000块,用完出来,或者退出时统计消费和剩余

gouwuche=0

function goods {

echo '请挑选商品
1.衣服500元
2.裤子400元
3.鞋子350元
4.帽子150元
5.袜子50元'
read choice

case $choice in

1)
echo "衣服500元"
gouwuche=$[500+$gouwuche]
echo "已将衣服添加到购物车,总计$gouwuche元"
;;

2)
echo "裤子400元"
gouwuche=$[400+$gouwuche]
echo "已将裤子添加到购物车,总计$gouwuche元"
;;

3)
echo "鞋子350元"
gouwuche=$[350+$gouwuche]
echo "已将鞋子添加到购物车,总计$gouwuche元"
;;

4)
echo "帽子150元"
gouwuche=$[150+$gouwuche]
echo "已将帽子添加到购物车,总计$gouwuche元"
;;

5)
echo "袜子50元"
gouwuche=$[50+$gouwuche]
echo "已将袜子添加到购物车,总计$gouwuche元"
;;

*)
echo "没有该商品"
;;

esac

return $gouwuche

}

function limit {

cash=2000

if (($cash < $gouwuche));

  then
    echo "对不起,余额不足!"
  
  else
    remain=$[$cash-$gouwuche]
    echo "您一共消费了$gouwuche元"
    echo "您还剩下$remain元,欢迎下次光临!"
  
fi

}

echo "欢迎光临"

for ((;;))
do

read -p "请问要购买商品吗?(y/n)" buy

if [ $buy = y ];
  then
    goods

  for ((;;))
  do
  
  read -p "请问还要继续购买商品吗?(y/n)" rebuy
  
    if [ $rebuy = y ];
    then
      goods
      
    elif [ $rebuy = n ];
    then
      limit
      break 2
    
    else
      echo "请输入正确选项!"
    
    fi
    
    done

elif [ $buy = n ];
then
  limit
  break
  
else
  echo "请输入正确选项!"
  
fi

done
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值