while循环
语法结构
while 条件;
do
循环体
done
while循环必须写退出条件,否则就是死循环
案例:计算100以内整数的和
#!/bin/bash
sum=0
num=0
while [ $num -lt 101 ];
do
sum=$[$sum+$num]
num=$[$num+1]
done
echo $sum
while处理文件
while read 变量名
do
循环体
done<文件路径
#!/bin/bash
while read line
do
echo $line
done
案例:重复提示用户输入字符串,无论输入什么字母,都转换成小写并显示,如果用户输入quit则退出
#!/bin/bash
while true;
do
read -p "enter:" str
str1=`echo $str | tr "A-Z" "a-z"`
if [ "$str1" == "quit" ];then
exit
else
echo $str1
fi
done
案例:显示所有uid和gid均为偶数的用户
#!/bin/bash
while read line
do
uid=`echo $line | awk -F ":" '{print $3}'`
gid=`echo $line | awk -F ":" '{print $4}'`
name=`echo $line | awk -F ":" '{print $1}'`
if [ $[$uid%2] -eq 0 ] && [ $[$gid%2] -eq 0 ];then
echo $name
fi
done</etc/passwd
循环控制:
break:终止循环
continue:跳过本轮循环,进入下一轮循环
案例:提示用户输入一个文件,如果文件不存在,就让用户重新输入,直到输入正确为止,则退出,quit则退出
#!/bin/bash
while true;
do
read -p "enter a file:" file
[ $file == "quit" ] && exit 0
if [ -e $file ];then
echo "$file 找到了"
break
else
echo "$file 找不到"
fi
done
bash随机数
/dev/random
0-32767
/dev/urandom
echo $RANDOM
echo $[$RANDOM%100] 输出一个100以内的随机数
案例:
使用RANDOM生成10个100以内的随机数,并找出最大的数放在第一位
#!/bin/bash
for i in {0..9};
do
num=$[$RANDOM%100]
list[$i]=$num
done
echo "原数组:${list[*]}"
for i in {1..9};
do
t=${list[0]}
if [ $t -lt ${list[$i]} ];then
list[0]=${list[$i]}
list[$i]=$t
fi
done
echo ":${list[*]}"
echo "最大值:${list[0]}"
案例:猜数字游戏,随机生成一个100以内的随机数,让用户输入数字,如果用户输入的数字和生成的随机数不同,则让用户重新输入,知道猜对为止
#!/bin/bash
sc=$[$RANDOM%100+1]
while true;
do
read -p "请输入一个数字:" num
if [ $num =~ "^[0-9]+$" ];then
if [ $num -eq $sc ];then
echo "恭喜,猜对了"
exit
elif [ $num -lt $sc ];then
echo "猜小了"
else
echo "猜大了"
fi
else
echo "请输入100以内的纯数字"
fi
done
case语句
case 变量名 in
样式1)
语句;;
样式2)
语句;;
样式3)
语句;;
样式n)
语句;;
esac
样式:
a|b:a或者b
*:任意长度的任意字符
?:单个字符
[ ]:范围匹配
[字符集]
案例:
提示用户输入一个字符
判断字符是数字类型还是字符串或者特殊符号
输入quit则退出
#!/bin/bash
read -p "enter:" str
case $str in
[[:digit:]])
echo "数字";;
[[:alpha:]])
echo "字母";;
[[:punct:]])
echo "符号";;
quit)
echo "bye"
exit;;*)
echo "其他"
esac
练习:
1.
石头剪刀布:
玩家和系统猜拳:
提示玩家出拳,
玩家赢提示,PC-win
电脑赢提示,NPC-win
平局提示,P-J
#!/bin/bash
while true;
do
read -p "0:石头 1:剪刀 2:布 3:退出游戏 请您输入数字出拳:" num
dn=$[$RANDOM%3]
if [ $num -eq 0 ] && [ $dn -eq 1 ];then
echo "玩家赢"
elif [ $num -eq 1 ] && [ $dn -eq 2 ];then
echo "玩家赢"
elif [ $num -eq 2 ] && [ $dn -eq 0 ];then
echo "玩家赢"
elif [ $num -eq $dn ];then
echo "平局"
elif [ $num -eq 3 ];then
echo "再见"
exit 0
else
echo "系统赢"
fi
done
2.计算三个文件/etc/passwd /etc/shadow /etc/group钟,一共有多少行、多少单词、多少个字符
#!/bin/bash
hang=0
dc=0
zf=0
for i in /etc/passwd /etc/shadow /etc/group;
do
h=`cat $i | wc -l`
d=`cat $i | wc -w`
z=`cat $i | wc -c`
hang=$[$hang+$h]
dc=$[$dc+$d]
zf=$[$zf+$z]
done
echo "行$hang"
echo "单词$dc"
echo "字符$zf"
3.输出100以内所有的偶数。(三种方法实现)
#!/bin/bash
for i in `seq 2 2 100`;
do
echo $i
done
#!/bin/bash
for i in {1..100};
do
if [ $[$i%2] == 0 ];then
echo $i
fi
done
#!/bin/bash
i=0
while [ $i -lt 101 ];
do
echo $i
i=$[$i+2]
done
4.求100以内偶数的和
#!/bin/bash
num=0
for i in {1..100};
do
if [ $[$i%2] == 0 ];then
num=$[$num+$i]
fi
done
echo $num
5.让用户输入两个数字,判断两个数字哪个大,哪个小?
要求:如果用户输入了非数字或者空,要求用户重新输入
#!/bin/bash
read -p "请输入第一个数值:" n1
read -p "请输入第二个数值:" n2
n1=`echo $n1 | grep -E ^"[[:digit:]]+"$`
n2=`echo $n2 | grep -E ^"[[:digit:]]+"$`
if [[ $n1 =~ [[:digit:]] ]] && [[ $n2 =~ [[:digit:]] ]];then
if [ $n1 -eq $n2 ];then
echo "两个数值相等"
elif [ $n1 -gt $n2 ];then
echo "$n1 大,$n2 小"
else
echo "$n2 大,$n1 小"
fi
else
echo "请输入正确数值"
fi
#!/bin/bash
read -p "请输入第一个数值:" n1
read -p "请输入第二个数值:" n2
if [[ $n1 =~ ^[[:digit:]]+$ ]] && [[ $n2 =~ ^[[:digit:]]+$ ]];then
if [ $n1 -eq $n2 ];then
echo "两个数值相等"
elif [ $n1 -gt $n2 ];then
echo "$n1 大,$n2 小"
else
echo "$n2 大,$n1 小"
fi
else
echo "请输入正确数值"
fi
6.让用户输入一个成绩,判断成绩的等级,等级如下
成绩大于等于90,输出A
成绩大于等于80,小于90,输出B
成绩大于等于70,小于80,输出C
成绩小于70,输出D
要求:用至少2钟方法实现
#!/bin/bash
read -p "请输入您的成绩:" cj
if [ $cj -lt 101 ];then
case $cj in
[9][0-9]|100)
echo "A";;
[8][0-9])
echo "B";;
[7][0-9])
echo "C";;
*)
echo "D";;
esac
else
echo "请输入1-100的成绩"
fi
#!/bin/bash
read -p "请输入您的成绩:" cj
if [ $cj -lt 101 ];then
if [ $cj -gt 89 ];then
echo "A"
elif [ $cj -gt 79 ];then
echo "B"
elif [ $cj -gt 69 ];then
echo "C"
elif [ $cj -lt 70 ];then
echo "D"
fi
else
echo "请输入0-100的成绩"
fi
7. 让用户输入账号(admin)和密码(123456),如果用户输入了错误的选择,则要
求用户重新输入,但是最多重新输入三次,错误次数超过3次后,自动退出。
#!/bin/bash
cis=0
while true;
do
if [ $cis -lt 3 ];then
read -p "请输入您的用户名:" user
read -p "请输入您的密码:" passwd
if [ $user == "admin" ] && [ $passwd == "123456" ];then
echo "登陆成功"
break
else
cis=$[$cis+1]
echo "用户名或密码错误,请重新输入"
continue
fi
else
echo "错误次数已达3次"
exit
fi
done
8.让用户输入一个文件,如果文件存在,并且文件属主是root输出ok,否则输出error
#!/bin/bash
read -p "请输入一个文件名" file
if [ -e $file ];then
shuzhu=`ls -l $file | awk -F " " '{print $3}'`
if [[ $shuzhu == "root" ]];then
echo "ok"
else
echo "error"
fi
else
echo "文件不存在"
fi
9.让用户输入一个用户名,判断这个用户uid和gid是否都是大于500,是就输出ok,否则输出error
#!/bin/bash
read -p "请输入一个用户名:" user
uid=`id -u $user`
gid=`id -g $user`
if [ $uid -gt 500 ] && [ $gid -gt 500 ];then
echo "ok"
else
echo "error"
fi
10.让用户输入一个数字,判断这个数字是否为偶数
#!/bin/bash
read -p "请输入一个数字:" num
if [ $[$num%2] == 0 ];then
echo "this is 偶数"
else
echo "this is 奇数"
fi
11.让用户输入一个文件,如果文件有空白行或者注释行,输出ok,否则输出error
#!/bin/bash
read -p "请你输入一个文件:" file
num=`cat $file | egrep ^"#|$" | wc -l`
if [ $num -gt 0 ];then
echo "ok"
else
echo "error"
fi
12.写个商店选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150
元,袜子50元),一家店可复购,每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继
续逛的话进行购物车结算总额,输出购物总额和逛了几家店
#!/bin/bash
dianpu=1
num=0
while true;
do
echo "欢迎来到第 $dianpu 家店铺"
read -p "1.衣服500元,2.裤子400元,3.鞋子350元,4.帽子150元,5.袜子50元,6.不买,请输入您要购买的商品序号:" gwc
case $gwc in
"1")
num=$[$num+500]
read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
if [ $yn -eq 1 ];then
dianpu=$[$dianpu+1]
continue
else
echo "本次逛了 $dianpu 家店,共消费$num元"
break
fi
;;
"2")
num=$[$num+400]
read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
if [ $yn -eq 1 ];then
dianpu=$[$dianpu+1]
continue
else
echo "本次逛了 $dianpu 家店,共消费$num元"
break
fi
;;
"3")
num=$[$num+350]
read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
if [ $yn -eq 1 ];then
dianpu=$[$dianpu+1]
continue
else
echo "本次逛了 $dianpu 家店,共消费$num元"
break
fi
;;
"4")
num=$[$num+150]
read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
if [ $yn -eq 1 ];then
dianpu=$[$dianpu+1]
continue
else
echo "本次逛了 $dianpu 家店,共消费$num元"
break
fi
;;
"5")
num=$[$num+50]
read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
if [ $yn -eq 1 ];then
dianpu=$[$dianpu+1]
continue
else
echo "本次逛了 $dianpu 家店,共消费$num元"
break
fi
;;
"6")
read -p "请问您是否继续购物:1.是,2.否,请输入您的选择:" yn
if [ $yn -eq 1 ];then
dianpu=$[$dianpu+1]
continue
else
echo "本次逛了 $dianpu 家店,共消费$num元"
break
fi
;;
esac
done