大家好,又见面了,我是你们的朋友全栈君。
1、for循环
语法:
for 变量 in 值列表 /seq(2 2 10)
do
命令序列
done
-----------------------
for((初值;条件;步长))
do
命令序列
done
------------------------
for 变量 in { ... }
do
命令序列
done
示例:循环创建10个系统账户
示例2:
批量创建用户
用户名存放在users.txt的文件,每行一个
初始密码123456
验证脚本
示例:99乘法表
示例:
根据IP地址检查主机状态
IP地址存放在ipadds.txt文件中
使用ping命令检测各主机的连通性
1.1、for循环读取文件
for i in `cat 文件名`
1.2、示例:生成随机密码
脚本自动生成一个8位随机密码,大小英文字母和数字
字符串长度
${#变量名}
截取字符串
${变量名:开始的下标:截取的长度}
字符串追加
变量1+=变量2
1.3、for循环分隔符
默认分隔符 " " \t \n 空格 制表符 换行符
当遇见这三类时,会导致换行输出
示例:
IFS_OLD=$IFS
IFS=$'\n'
利于上述,修改IFS,同时在其他命令中利用
IFS=$IFS_OLD
还原规则
1.3.1、示例:换行输出$PATH
1.4、双层循环
for(( ; ; ))
do
for(( ; ; ))
do
命令序列
done
done
1.4.1、示例:99乘法表
#!/bin/bash
for((i=0;i<9;i++))
do
for((j=0;j<=i;j++))
do
sum=i*j
echo -n "$i*$j=$sum "
done
echo " "
done
1.4.2、示例:打印菱形
#!/bin/bash
# 行 列 * 行 列
###* 0 2 0 0
##*** 1 1 1 2
#***** 2 0 2 4
##*** 0 1 0 2
###* 1 2 1 0
#打印上半部分
for((i=0;i<3;i++))
do
#打印空格
for((j=0;j<=2-i;j++))
do
echo -n " "
done
#打印*
for((j=0;j<=2*i;j++))
do
echo -n "*"
done
echo " "
done
#打印下半部分
for((i=0;i<2;i++))
do
#打印空格
for((j=0;j<=1+i;j++))
do
echo -n " "
done
#打印*
for((j=0;j<=2-2*i;j++ ))
do
echo -n "*"
done
echo " "
done
2、while循环
语法:
while 条件测试
do
命令序列
done
2.1、while循环读取文件
法一
#line 为变量名
while read line #读取每行文件
do
echo $line #输出每行
done < 文件名 #文件名交给while
法二
cat 文件名 | while read line #读取每行文件
do
echo $line #输出每行
done
2.2、示例1、批量添加用户
批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、stu2、...
初始密码均为123456
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i
#i=$[$i+1]
let i++
done
2.3、示例2、猜商品价格游戏
猜商品价格游戏
通过变量RADNOM获得随机数
提示用户猜测并记录次数,猜中后退出循环
#!/bin/bash
num=$[$RANDOM % 1000]
#a用于方便退出while循环
a=0
#b用于统计猜测次数
b=0
while [ $a -eq 0 ]
do
read -p "请输入你猜的价格(0-999):" price
if [ $price -eq $num ]
then
echo "恭喜你,猜对了"
let b++
#当猜对时候,就让a变成1,实现退出while操作
let a++
elif [ $price -lt $num ]
then
echo "猜小了,请继续猜"
let b++
elif [ $price -gt $num ]
then
echo "猜大了,请继续猜"
let b++
fi
done
echo "你一共猜了 $b 次 "
3、until循环
until 条件测试操作
do
命令序列
done
3.1、示例1、计算1-50的和值
通过循环累加的方式计算1-50的和值
#!/bin/bash
i=0
sum=0
until [ $i -gt 50 ]
do
sum=$[sum+i]
let i++
done
echo "1-50的和为 $sum "
3.2、示例2、为指定用户发送在线消息
若用户不在线(未登录系统),则每10分钟试一次,直至用户登录系统后再发送信息 用户名与消息通过位置参数传递给脚本
4、多线程
利用 实现后台并行执行
do
{
}&
done
wait
示例
#!/bin/bash
#多线程
for((i=1;i<=254;i++))
do
{
ping -c 3 -i 0.5 -w 2 192.168.96.$i &> /dev/null
if [ $? -eq 0 ]
then
echo "192.168.96.$i is online" >> /root/shell4/host_ip_online.txt
else
echo "192.168.96.$i is offline" >> /root/shell4/host_ip_offline.txt
fi
}&
#增加&符号,代表的是将进程放到后台处理,后台命令之间是不区分先来后到关系的
done
#执行wait,等待上面所有后台进程执行完毕后,才会执行后面的语句
#没有wait,后面语句不会等待后台进程的,会对一些需要上下文依赖关系的程序执行错误
wait
cat /root/shell4/host_ip_online.txt
cat /root/shell4/host_ip_offline.txt
5、循环体三种跳出方式
5.1、exit
-
n (0-255) 退出shell脚本进程,并且可以返回指定状态码
-
exit执行后,脚本后面所有语句都不会执行
5.2、break
-
跳出当前的循环体,去执行循环后面的语句
-
break跳出单层循环,break 2跳出2层循环
5.3、continue
-
终止某次循环的执行,但是不会完全终止整个循环
-
while until循环中使用需要谨慎,因为continue放在变量迭代语句前会造成死循环
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163938.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...