目录
循环和遍历
什么是循环和遍历
循环
循环是重复执行一段代码的结构,通过循环可以在满足一定的条件之下多次执行相同的代码
循环体,代码的总结构。循环条件,当循环条件满足时,循环体内的代码才会执行,条件不满足,循环结束。
遍历
对数据结构中的每个元素都进行一次访问的过程。进行操作或输出。
总结:循环和遍历是结合在一起使用的,循环实际上是一种控制流程的结构,用于重复执行代码,遍历是对数据进行访问和操控的过程。
循环的特点
1.重复执行代码
2.简化程序的逻辑,提高程序的可读性和可理解性,降低了代码出错的可能
3.提高了代码的重复利用率
4.提高了效率,循环可以自动化的让程序执行,减少了人工的干预。
循环的作用就是为了批量的执行代码的一种方式,减少人工干预,提高效率
循环语句
for循环语句
读取不同的变量值,用来重复执行同一组命令
for循环主要用于已知次数的循环
语法结构
for 变量名(不是引用变量) in 取值范围
do
命令序列,对取值范围内的变量进行特定的操作
done 循环结束的标志
类c语言格式
for ((表达式1;表达式2;表达式3))
do
命令序列
done
注 for ((;;))是死循环
双重for循环
for 变量名(不是引用变量) in 取值范围
do
for
do
done
done
循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,例如在for循环语句中,可以再嵌套一个for 循环,这样的 for 循环语句我们称之为双重for循环。
外面大循环,大循环控制整个循环的次数,大循环打印的是行,内循环控制的是列
while循环语句
满足条件才会执行循环,不满足结束循环
用于不知道循环次数,需要主动结束循环或达到条件循环的场景
while [ 条件判断 ]
do
命令序列
done
死循环
while ture
while [ 1 -eq 1 ]
until循环语句
重复测试某个条件,当判断条件不成立时进行循环,条件成立停止循环
until [ 条件测试语句 ]
do
命令序列
done
循环控制语句
break
满足条件触发后,会立刻跳出,即使后面还有条件,也不再执行,整个循环结束。
continue
满足条件触发后,只会跳出这一次循环,如果后面的循环条件依然存在,继续执行
exit 直接退出,后续代码不再执行,整个脚本立刻终止
其他
并行执行
{
#命令
}&
wait
wait执行结束不等代直接退出
echo命令
echo -n 不换行输出
echo -e 可以使用转义符
\b 删除键
\n 换行输出
\t 相当于tab键的空格
\c 不换行输出,字符过长会导致字符不输出
随机数变量
$RANDOM 只能表示一个随机整数
默认范围:0-32767
$((RANDOM%100)) 1-99
$((RANDOM%1000+1)) 1-1000
实验
例一
有一家店,衣服 500,裤子 400,鞋子 300,帽子 200,袜子 100。
每次选购完成之后都要提示用户是否继续购买,如果用户不买了,要提示结算金额,你消费了多少
如果继续买,就继续添加商品,最后也要给一个总金额。
sum=0
while true
do
echo "衣服500 裤子400 鞋子300 帽子200 袜子100 "
read -p "买什么" shoping
if [ "$shoping" == "衣服" ]
then
sum=$(($sum+500))
elif [ "$shoping" == "裤子" ]
then
sum=$(($sum+400))
elif [ "$shoping" == "鞋子" ]
then
sum=$(($sum+300))
elif [ "$shoping" == "帽子" ]
then
sum=$(($sum+200))
elif [ "$shoping" == "袜子" ]
then
sum=$(($sum+100))
else
echo "输入错误"
fi
echo "总金额为${sum}"
read -p "是否继续购买 yes/no" a
if [ "$a" = "yes" ]
then
continue
else
echo "总金额为${sum}"
break
fi
done
例二
用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,
输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;
若该用户不存在,提示用户输入密码,建立用户并设立其密码
for user in $(cat /opt/users.txt)
do
cat /etc/passwd | awk -F: '{print $1}' | grep -w "${user}"
if [ $? -eq 0 ]
then
echo "${user}用户存在"
cat /etc/shadow | grep "${user}" | awk -F: '{print $2}' | grep '!!'
if [ $? -eq 0 ]
then
echo "无密码"
read -p "请输入${user}密码" mima
echo "$mima" | passwd --stdin ${user}
else
echo "有密码"
fi
else
echo "${user}用户不存在,建立用户"
useradd "$user"
read -p "请输入密码" mima
echo "$mima" | passwd --stdin ${user}
fi
done
例三
使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数
read -p "输入0-255的数:" num
a=128
for ((i=1;i<=8;i++))
do
b=$(($num-$a))
if [[ $b -lt 0 ]]
then
echo -n "0"
else
num="$b"
echo -n "1"
fi
a=$(($a/2))
done