shell脚本之循环语句

循环语句

循环含义

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件

for循环语句

一般知道循环次数使用for循环

bash 复制代码
第一类
格式1:
for名称 in 取值次数;do;done;
格式2:
for 名称 
in {取值列表}
do
done

# 打印20次
for i in {1..20}
do
echo $i
done
bash 复制代码
在这里插入代码片#100个数累加
sum=0
for i in {1..100}
do
let sum+=i
done
echo $sum
#奇数和
sum=0
for i in `seq 1 2 100`
do
sum=$[sum+1]
done
echo $sum
#偶数和
将奇数和`seq 1 2 100` 改为 `seq 0 2 100`


bash 复制代码
第二种
格式1
for (( 表达式1; 表达式2; 表达式3 )); do 命令; done
格式2
for ((expr1;expr2;expr3))
do
command
done

expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
bash 复制代码
#1到10个数的累加
for ((i=0;i<=10;i++))
do
sum=$[i+sum]
done
echo $sum
bash 复制代码
#检测网络连通性
for i in {1..254}
do
{
ping -c2 -W1 192.168.65.${i} &>/dev/null  #-c2 ping两次,W1超时一秒返回
if [ $? -eq 0 ]
then
echo "host $i is online" >> /data/online.txt
else
echo "host $i is offline">> /data/offline.txt
fi
} &  # &后台执行
done
bash 复制代码
99乘法表
#打印一行*
#!/bin/bash
for i  in {1..9}
do
echo -e " * "
done

打印正方形
#!/bin/bash
for j in {1..9}
do
for i  in {1..9}
do
echo -e " * \c"		#\c换行
done
echo	#换行
done

直角三角形
#!/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
for j in {1..9}
do
for i in `seq $j`
    do
    echo -e "${i}*${j}=`echo $[i*j]`\t\c" #\t表示对齐
    done
    echo
done
bash 复制代码
批量添加用户
#!/bin/bash
ulist=$(cat /opt/user.txt)
for uname in $ulist
do
   useradd $uname
   echo "123123" |passwd --stdin  $uname #免交互设置密码
   &>/dev/null
done

while循环语句

不知道循环次数,知道停止条件时一般使用while

bash 复制代码
格式      
while 判断条件
do
done

# 累加
#!/bin/bash
sum=0
i=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
done
echo $sum
bash 复制代码
#!/binbash
p=`echo $[PANDOM%1000+1]` #随机生成数
time=0
while true
do
read -p "商品价格" h
let time++
if [ $h -eq $p ]
then
echo "恭喜猜对了,一共猜了${time}"
exit
elif [ $h -gt $p ]
then
echo "您猜的价格高了" 
else
echo "您猜的价格低了"
fi
done

untli循环语句

bash 复制代码
until 方式的1到100 的累加
#!/bin/bash
i=0
sum=0
until [ $i -gt 100 ]
do
sum=$[sum+i]
let i++
done
echo $sum
[root@localhost data]#bash until.sh
5050
bash 复制代码
#为指定用户发送在线消息
#若用户不在线(未登录系统),则每1分钟试一次,直至用户登录系统后在发送信息
#用户名与消息通过位置参数传递给脚本
[root@localhost data]#vim test3.sh
#!/bin/bash
username=$1
if [ $# -lt 1 ]
then
echo"请在脚本后输入 用户名和发送信息"
exit 1
fi

if grep "^$username" /etc/passwd &>/dev/nu11
then :
else
echo "用户不存在"
exit 1
fi

until who |grep $username &>/dev/nu11
do
echo "用户不在线"
sleep 5
done

mes=$2
echo $mes |write $username
[root@localhost data]#bash test3.sh

rep "^$username" /etc/passwd &>/dev/nu11
then :
else
echo "用户不存在"
exit 1
fi

until who |grep $username &>/dev/nu11
do
echo "用户不在线"
sleep 5
done

mes=$2
echo $mes |write $username
[root@localhost data]#bash test3.sh

双循环和跳出循环

  • break跳出单个循环后面加数字2则代表跳出两层循环
  • continue终止某次循环中的命令,但是不会完全终止命令
bash 复制代码
#本层循环
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then continue 
fi
echo i=$i
done

#本层循环
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then break
fi
echo i=$i
done
相关推荐
wheeldown3 分钟前
【Linux】Linux 进程通信:System V 共享内存(最快方案)C++ 封装实战 + 通信案例,4 类经典 Bug 快速修复
linux·运维·服务器·开发语言
小年糕是糕手13 分钟前
【数据结构】双向链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表
将车24418 分钟前
C++实现二叉树搜索树
开发语言·数据结构·c++·笔记·学习
梵得儿SHI34 分钟前
Java 反射机制核心类详解:Class、Constructor、Method、Field
java·开发语言·反射·class·constructor·java反射·java反射机制
kevlin_coder43 分钟前
🚀 实现同一个滚动区域包含多个虚拟滚动列表
前端·javascript
金梦人生44 分钟前
JS 性能优化
前端·javascript
peachSoda71 小时前
自定义配置小程序tabbar逻辑思路
javascript·vue.js·微信小程序·小程序
hbqjzx1 小时前
记录一个自动学习的脚本开发过程
开发语言·javascript·学习
浪裡遊1 小时前
React开发模式解析:JSX语法与生命周期管理
前端·javascript·react.js·前端框架·ecmascript
fruge1 小时前
Vue 3 完全指南:响应式原理、组合式 API 与实战优化
javascript·vue.js·ecmascript