循环例题
用户类
批量建立用户
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