shell的实战训练(世间纵有清风明月 远不及你柔情似水)

购物

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

num=0
for ((i=1;i<=5;i++))
do
echo 是否进入第"$i"家店?
read -p "输入(y & n)" shu
while [ $shu = "y" ]
do
  echo 1.衣服   ¥"$yi"
  echo 2.裤子   ¥"$ku"       
  echo 3.鞋子   ¥"$xie"        
  echo 4.帽子   ¥"$mao"     
  echo 5.袜子   ¥"$wa"      
 echo "您想购买啥 美女/帅哥?"
 read bh
echo "美女/帅哥还要买吗?(y & n)"
read shu

case $bh in
1)
 let num+=$yi
 echo 总价为"$num" &> /dev/null
;;

2)
 let num+=$ku
 echo 总价为"$num"&> /dev/null
;;

3)
 let num+=$xie
 echo 总价为"$num"&> /dev/null
;;

4)
 let num+=$mao
 echo 总价为"$num"&> /dev/null
;;

5)
 let num+=$wa
 echo 总价为"$num"&> /dev/null
;;

*)
 echo "您的选择有误,请检查输入"
esac
done
done
echo 您本次购买的总价为:$num

运行结果
在这里插入图片描述
第二种方法

#!/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。"

猴子吃香蕉

猴子摘下了n个香蕉,当天吃掉一半多一个,第天也是吃掉剩下香蕉一半多一个,到了第十天,香蕉只剩下了1个
问: 猴子第一天摘了多少香蕉?

#!/bin/bash
n=1
for ((i=9;i>0; i--))
do
n=$[(n+1)* 2]
done
echo $n

斐波拉切数

1 1 2 3 5 8 13 21 34 55 89求前10个数的总和

a=1
b=1
C=O
for i in f1..10)
do
echo $a
C=$[C + a]
sum=$[a + b]
a=$b

十进制转二进制

[root@localhost2 ~]#vim numchange.sh
#依次减数法
#!/bin/bash
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 ""
 
#取余倒排法
#!/bin/bash
sum=''
read -p "请输入一个0~255的整数:" num
for i in {1..8}
do
  NUM=$[num % 2]
  sum=$NUM$sum
  let num/=2
 
done
echo $sum
 
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:231
11100111
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:54 
00110110
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:83 
01010011

生成随机数八位密码

[root@localhost1 data]#vim randompasswd.sh
#!/bin/bash
#指定随机字符的范围
STR="ABCDRFGHIJKLMNOPQRSTUVWXTZabcdrfghijklmnopqrstuvwxtz0123456789"
sum=''
for ((i=1; i<=8; i++))    #指定循环6次(实现输出6位字符)
do
   length=${#STR}    #获取字符范围的长度
   num=$[RANDOM % length]    #在指定长度中生成随机数(作为取字符的索引)
   value=${STR:num:1}    #截取指定索引字符
   sum+=$value    #字符追加到sum变量中
done
echo $sum    #输出$sum(即8位随机密码)
 
[root@localhost1 data]#bash randompasswd.sh
3qCkpA
[root@localhost1 data]#bash randompasswd.sh
CtdDOG
[root@localhost1 data]#bash randompasswd.sh
nTuF0G

检查文件中用户名是否存在并提示创建用户和设置密码

#创建 users.txt 用户列表文件
[root@localhost1 ~]#cd /data
[root@localhost1 data]#vim users.txt
#需要创建的用户列表
zhangsan
lisi
wangwu
zhaoliu
qianqi
zhuba
 
#编写 checkuser.sh 脚本
[root@localhost1 data]#vim checkuser.sh
#!/bin/bash
#用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;若该用户不存在,则建立用户并提示用户设置密码
 
for user in `cat /data/users.txt`     #指定循环范围(用户列表文件users.txt)
do
  grep "^$user" /etc/passwd &> /dev/null  #判断用户是否存在
  if [ $? -eq 0 ];then     #用户存在
    echo "用户${user}已存在!"
 
    #检查存在的用户密码是否为空
    checkpd=`cat /etc/shadow | grep "^${user}" | awk -F: '{print $2}'`
    if [ $checkpd = "!!" ] || [ -z ${checkpd} ];then  #存在用户密码为空
    while true  #一直循环提示用户输入密码
    do
      read -p "用户${user}尚未输入密码,请创建密码:" passwd1
      read -p "再次输入确认密码:" passwd2
      if [ ${passwd1} = ${passwd2} ];then    #只有当两次密码相同时,设置密码并退出循环
        echo ${passwd1} | passwd --stdin $user
        break
      fi
    done
    fi
  else  #用户不存在
    useradd ${user}  #创建用户
    echo "用户${user}不存在,已为您创建${user}!"
    while true    #一直循环提示用户输入密码
    do
      read -p "用户${user}尚未输入密码,请创建密码:" passwd3
      read -p "再次输入确认密码:" passwd4
      if [ ${passwd3} = ${passwd4} ];then    #只有当两次密码相同时,设置密码并退出循环
        echo ${passwd3} | passwd --stdin $user
        break
      fi
    done
  fi
done
 
#测试 checkuser.sh
[root@localhost1 data]#bash checkuser.sh
#zhangsan存在且有密码
用户zhangsan已存在!
 
#lisi存在但无密码,需要设置
用户lisi已存在!
用户lisi尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
 
#wangwu存在但无密码,需要设置
用户wangwu已存在!
用户wangwu尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
 
#zhaoliu存在且有密码
用户zhaoliu已存在!
 
#qianqi不存在且无密码,需要设置
用户qianqi不存在,已为您创建qianqi!
用户qianqi尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 qianqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
 
#zhuba不存在且无密码,需要设置
用户zhuba不存在,已为您创建zhuba!
用户zhuba尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 zhuba 的密码 。
passwd:所有的身份验证令牌已经成功更新。

根据百米赛跑成绩判断结果

[root@localhost1 ~]#vim judgerace.sh
#!/bin/bash
#提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;
#进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
 
read -p "请输入您的100米赛跑成绩(s):" time
if [ $time -gt 0 -a $time -le 10 ] ;then
  echo "恭喜您,进入选拔赛!"
  read -p "请输入您的性别(男/女):" sex
    case $sex in
    男)
      echo "请您进入男生组!"
      ;;)
      echo "请你进入女生组!"
      ;;
    *)
      echo "输入有误,请重新输入!"
      ;;
    esac
elif [ $time -gt 10 ];then
  echo "很遗憾,您没有进入选拔赛!"
else
  echo "输入有误,请重新输入!"
fi
 
[root@localhost1 ~]#bash judgerace.sh
请输入您的100米赛跑成绩(s):8
恭喜您,进入选拔赛!
请输入您的性别(男/女):男
请您进入男生组!

随机数实现猜数字游戏

[root@localhost1 data]#bash guessprice.sh
#!/bin/bash
#获取0~999的随机数
num=$[RANDOM % 1000]
i=1 #定义i为循环条件
a=0 #定义a为猜测次数变量
while [ $i -eq 1 ]
do
read -p "请输入你猜测的价格(0~999):" price
  if [ $price -eq $num ];then
    echo "恭喜你猜对了!"
    let a++
    let i+=1
  elif [ $price -gt $num ];then
    echo "你猜高了,请继续!"
    let a++
  elif [ $price -lt $num ];then
    echo "你猜低了,请继续!"
    let a++
  fi
done
echo "你一共猜了${a}次。"
 
[root@localhost1 data]#bash guessprice.sh
请输入你猜测的价格(0~999):600
你猜高了,请继续!
请输入你猜测的价格(0~999):400
你猜高了,请继续!
请输入你猜测的价格(0~999):200
你猜高了,请继续!
请输入你猜测的价格(0~999):100
你猜低了,请继续!
请输入你猜测的价格(0~999):150
你猜高了,请继续!
请输入你猜测的价格(0~999):120
你猜低了,请继续!
请输入你猜测的价格(0~999):134
你猜低了,请继续!
请输入你猜测的价格(0~999):140
你猜高了,请继续!
请输入你猜测的价格(0~999):135
你猜低了,请继续!
请输入你猜测的价格(0~999):137
你猜高了,请继续!
请输入你猜测的价格(0~999):136
恭喜你猜对了!
你一共猜了11次。

利用for循环打印99乘法表

[root@localhost2 ~]#vim chengfabiao.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
    m=$[ $i * $j ]    #乘积值赋给m
    echo -ne "$i*$j=${m} "    #指定输出样式
  done
  echo -e '\n'    #每行输出完后换行
done
 
 
[root@localhost2 ~]#bash chengfabiao.sh
1*1=1
 
2*1=2 2*2=4
 
3*1=3 3*2=6 3*3=9
 
4*1=4 4*2=8 4*3=12 4*4=16
 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值