凡是重复执行一段代码, 都可以称之为循环。 循环体中三种专业的话术:遍历、迭代、递归 。
遍历(traversal) - 按规则访问非线性结构中的每一项。
迭代(iterate) - 按顺序访问线性结构中的每一项。
递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况。
通常有进入循环的条件和退出循环的条件。
循环次数分为两种:
常见的循环命令:for, while, until。
程序先进行语句判断。
如果判断为真则执行循环语句,然后再进行语句判断,直至语句判断失败才跳出。
如果判断为假,直接跳出,不继续执行。
for需要知道循环次数。
#结构#
for i in 循环次数
#i可以替换成任意,标准格式是i
do
command #循环动作
done
#结束循环
示例:求1-100的和
#!/bin/bash
sum=0
for i in `seq 100`
do
sum=$[i + sum]
done
echo "sum:$sum"
#其他写法
let sum=`expr $1 + $sum`
let sum= $1 + $sum
let sum+=$i
# += 累加赋值
{ }和seq的用法
{1..100..2} #1-100中的所有奇数
{2..100..2} #1-100中的所有偶数
seq 100 #1-100
seq 1 2 100 #1-100中的所有奇数
seq 0 2 100 #1-100中的所有偶数
#基本格式#
for 变量名
#不指定变量范围
do
command
done
#举个例子#
#!/bin/bash
for i
do
echo "hello"
done
exp1为初始值表达式,定义变量并赋初值;
exp2为判断条件表达式,决定是否循环;
exp3用于决定循环变量如何改变,决定循环什么时候退出。
#格式#
for ((exp1;exp2;exp3))
do
command
done
#举个例子#
#求和
1 for((i=0;i<=10;i++))
2 do
3 sum=$[i+sum]
4 done
5 echo $sum
~
#累加
for i in `seq 1 100`
do
let sum+=$i
done
echo "sum:$sum"
#九九乘法表
#!/bin/bash
for j in {1..9}
do
for i in `seq $j`
do
echo -e "${i}*${j}=`echo $[i*j]`\t\c"
done
echo
done
#面试题#
#批量改后缀#
#!/bin/bash
cd 目标目录
for i in *
do
alhpa= `echo $i | awk -F '[0-9]+' '{print $1}'`
alnum= `echo $i |grep -oE '[0-9]+' `
mv $i ${almun}${alpha}.aa
done
#!/bin/bash
vim user.txt #在此文件添加用户
vim user.sh #脚本
#!/bin/bash
for i in `cat ./user.txt`
do
echo 123132 | passwd $i --stdin
done
#批量删除用户
#!/bin/bash
for i in `cat /user.txt`
do
userdel -r $i
done
for i in {1..254}
do
{
ping -c2 -W1 192.168.91.$i &>/dev/null
if [ $? -eq 0 ]
then
echo "host $i is online" >> online.txt
else
echo "host $i is offline" >> offline.txt
fi
} &
done
# & 放入后台执行
while语句用于重复测试某个条件,只要条件成立则反复执行,当命令判断为假时停止执行。
只知道停止条件,不知道次数时,就需要使用while。
while 判断条件
do
command
done
由于缺少结束条件,循环会一直持续下去,这就是死循环。
while true
do
echo "这是一个死循环"
done
#除了true,还可以用 :
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
let sum+=$i
#防止死循环
let i++
done
echo $sum
#!/bin/bash
#1-1000 不限次数 猜高会提示高 猜低会提示低 统计猜了多少次
p=`echo $[RANDOM%1000+1]`
t=0
while true
do
read -p "你猜是多少(1-1000)" price
let t++
if [ $price -eq $p ]
then
echo "你真聪明"
echo "你一共猜了${t}次"
exit
elif [ $price -gt $p ]
then
echo "友情提示,太高了"
else
echo "友情提升,低了"
fi
done
#需要满足
#批量添加20个用户,用户名以stu开头,按编号排序
#初始密码为123123
#!/bin/bash
i=1
while [ "${i}" -le 20 ]
do
useradd stu${i}
echo 123123 | passwd stu${i} --stdin &>/dev/null
let i++
done
until语句用于重复测试某个条件,和while语句相反,只要条件不成立则反复执行,条件成立时,退出循环。
until 条件测试
do
command
done
#!/bin/bash
i=0
sum=0
until [ ${i} -ge 100 ]
do
let sum+=${i}
let i++
done
echo " $sum "
#!/bin/bash
#用位置变量表示输入的用户名,第一位
username=$1
if [ $# -lt 1 ]
then
echo " 输入目标用户名和要发的消息:"
exit 1
fi
if grep "^$username" /etc/passwd &>/dev/null
then :
else
echo "查无此人"
exit 1
fi
until who|grep $username &>/dev/null
do
echo "用户暂时不在线"
#等待5秒,再次发送信息
sleep 5
done
#用位置变量表示要发送的信息
mes=$2
echo $mes | write $username
当执行 exit
语句后,脚本将立即终止,并且不会再执行后续的代码。
#!/bin/bash
while true
do
# 条件判断
if [ 条件 ]
then
exit # 退出脚本
fi
# 循环体代码
done
break
语句会立即终止最内层的循环,并跳出该循环体执行循环后的代码。
break n 代表跳出n层循环
#n为具体数字
while true
do
# 条件判断
if [ 条件 ]
then
break # 退出循环
fi
# 循环体代码
done
continue
语句会跳出当前循环,但是不会终止命令。
while true
do
# 条件判断
if [ 条件 ]
then
continue # 跳过本次循环迭代,继续下一次迭代
fi
# 循环体代码
done