shell 循环语句[通俗易懂]

shell 循环语句[通俗易懂]循环语句:for语法结构:1、列表循环forvariablein{list}docommand…doneforvariableinvar1var2var3..docommand…done2、非列表循环forvariabledocommand..done3、类C风

大家好,又见面了,我是你们的朋友全栈君。

循环语句:
for 语法结构:
1、列表循环
for variable in {list}
     do
    command...
     done
for variable in var1 var2 var3..
    do
       command...
    done
2、非列表循环
for variable
   do
     command..
   done
3、类C风格
for ((expr1;expr2;expr3))
  do
    command...
  done

expr1:定义一个变量并且给初始值
expr2:根据某个条件决定循环的次数
expr3:变量以什么样的方式去改变

循环列表:
 1030  for i in {
  
  1..10};do echo $i;done
 1031  for i in;do echo $i;done 1 2 3 
 1032  for ((i=1;i<=50;i++));do echo $i;done
 1033  for ((i=50;i<=100;i++));do echo $i;done
 1034  for i in {
  
  50..100};do echo $i;done
 1035  for i in {
  
  1..100..2};do echo $i;done
 1036  for i in {
  
  0..100..2};do echo $i;done
 1037  for i in {
  
  0..100..3};do echo $i;done
 1038  for i in {
  
  100..50..5};do echo $i;done
 1039  for i in `seq 10`;do echo $i;done
 1040  for i in $(seq 10);do echo $i;done
 1041  for i in $(seq 1 2 10);do echo $i;done
       for ((i=1;i<=10;i+=2));do echo $i;done

demo1:计算1-100之间的奇数之和
方法1#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
   do
     sum=$[$sum+$i]
   done
echo "1-100之间的奇数和为:$sum"
方法2#!/bin/bash
sum=0
for i in {
  
  1..100..2}
  do
     #sum=$[$sum+$i]
     let sum=$sum+$i
   done
echo "1-100之间的奇数和为:$sum"

方法3#!/bin/bash
sum=0
for i in `seq 1 100`
  do
    [ $[$i%2] -ne 0 ] && sum=$[$sum+$i]
  done
echo "1-100之间的奇数和为:$sum"

方法4#!/bin/bash
sum=0
for i in `seq 1 100`
  do
   if [ $[$i%2] -eq 0 ];then
     continue
   else
    sum=$[$sum+$i]
   fi
  done
echo "1-100之间的奇数和为:$sum"

计算1-50之间的偶数之和

循环控制:
continue:重新开始下一次循环,继续。
break:打断,马上停止此次循环,执行循环体外的代码
exit:退出,退出循环

demo2:输入一个正整数,判断其是不是质数(素数)
质数:能被1和它自己本身整除的数
2 3 5 7 11 13 17...
思路:
1、如果所输入的整数能被其他整数整除,它就不是质数 $num%$i=0
2、根据上面的方法需要排除12
3、测试变量i的取值范围2开始到num-1

#!/bin/bash
read -p "请输入你要判断的正整数:" num
if [ $num -eq 1 ];then
   echo "$num不是质数";exit
 elif [ $num -eq 2 ];then
   echo "$num是质数";exit
fi

for i in `seq 2 $[$num-1]`
  do
   if [ $[$num%$i] -eq 0 ];then
     echo "$num不是质数";exit
   fi
  done
     echo "$num是质数"


课堂练习:
1、批量添加3个用户,以u1-u3命名,并且同一加一个新组class,密码都为123
2、写一个脚本,局域网内,把能ping通的ip和不能ping通的ip分类,并保存到两个不同的文件中。IP范围(10.1.1.1010.1.1.20)

参考1#!/bin/bash
group=class
grep -w $group /etc/group &>/dev/null
[ $? -ne 0 ] && groupadd $group 
for i in 1 2 3
 do
   useradd -G class u$i
   echo 123|passwd --stdin u$i &>/dev/null
 done

参考2for ((i=10;i<=20;i++))
  do
  ping -c 1 10.1.1.$i &>/dev/null
  [ $? -eq 0 ] && echo "the IP 10.1.1.$i is ok" >> /tmp/ip_ok.log || echo "the IP 10.1.1.$i is not ok" >> /tmp/ip_notok.log
  done

until 循环: 条件为真退出循环;条件为假进入循环
语法:
until expr
 do
   command...
 done


#!/bin/bash
i=1
until [ $i -gt 5 ]
  do
   echo $i
   let i=$i+1
  done


#!/bin/bash
i=5
until (( $i <1 ))
do
echo $i
let i=$i-1
done

demo1:批量创建用户stu1~stu3,家目录为/rhome/stuX,密码为123
#!/bin/bash
dir=/rhome
[ ! -d $dir ] && mkdir -p $dir
i=1
until [ $i -gt 3 ]
  do
    useradd -d $dir/stu$i stu$i
    echo 123|passwd --stdin stu$i
    let i=$i+1
  done



while 循环:条件为假退出循环;条件为真进入循环
语法:
while expr
do
  command
done

#!/bin/bash
i=1
while [ $i -le 5 ]
 do
   echo $i
   let i=$i+1
 done


#!/bin/bash
i=5
while (( $i >= 1 ))
 do
   echo $i
   let i=$i-1
 done

思考:
i=1while打印5 4 3 2 1

demo1:
写一个30s同步一次时间服务器10.1.1.254的脚本,如果同步失败,则邮件报警,每次失败都报警;如果同步成功,也需要邮件通知,但是成功100次才通知一次
思路:
1、该脚本应该是一个死循环在后台执行
2、怎么样去同步时间 (命令)
3、根据命令所执行的结果判断是否成功;
4、如果失败直接发邮件;如果成功,统计成功次数,到100才发邮件

#!/bin/bash
ip=10.1.1.254
count=0
while true
 do
  ntpdate $ip &>/dev/null
  if [ $? -ne 0 ];then
     echo ntpdate failed |mail -s "Check system date" root
  else
     let count++
     if [ $count -eq 100 ];then
     echo ntpdate successed |mail -s "Check system date" root
     count=0
     fi
  fi
sleep 30
 done


#!/bin/bash
ip=10.1.1.254
count=0
while true
 do
  ntpdate $ip &>/dev/null
  [ $? -ne 0 ] && echo ntpdate failed |mail -s "Check system date" root
  let count++
   [ $[$count%100] -eq 0 ] && echo ntpdate successed |mail -s "Check system date" root
sleep 30
 done

以上脚本有问题,自己去完善


#!/bin/bash
ip=10.1.1.254
count=0
while true
 do
  ntpdate $ip &>/dev/null
  if [ $? -ne 0 ];then
     echo ntpdate failed |mail -s "Check system date" root
  else
     let count++
     [$[$count%100] -eq 0 ] && echo ntpdate successed |mail -s "Check system date" root
     fi
  fi
sleep 30
 done

总结:
12345
54321

for
for ((i=1;i<=5;i++))
  do
   echo -n $i
  done

for i in 1 2 3 4 5
  do
  echo -n $i
  done

for i in {
  
  1..5}
  do
  echo -n $i
 done


for i in `seq 5`
  do
  echo -n $i
  done

for i
  do
   echo -n $i
  done
./for1.sh 1 2 3 4 5

until
i=1
until [ $i -gt 5 ]
do
echo -n $i
let i++
done

i=5
until (( $i < 1 ))
do
echo -n $i
let i--
done


while
i=1
while [ $i -le 5 ]
 do
  echo -n $i
  let i++
 done
echo

i=5
while (( $i -ge 1 ))
  do
  echo -n $i
  let i--
  done
echo

随机数:
bash默认有一个RANDOM,它是产生随机数的一个变量,032767
$[$RANDOM%2] 0~1
$[$RANDOM%3] 0~2
$[$RANDOM%6] 0~5
$[$RANDOM%10] 0~9

$[$RANDOM%100]   0~99
$[$RANDOM%51+50] 50~100
$[$RANDOM%900+100] 产生三位随机数

demo1:写一个脚本,产生一个phonenum.txt,保存1000个以139开头电话号码
#!/bin/bash
for i in {
  
  1..1000}
  do
   n1=$[$RANDOM%10]
   n2=$[$RANDOM%10]
   n3=$[$RANDOM%10]
   n4=$[$RANDOM%10]
   n5=$[$RANDOM%10]
   n6=$[$RANDOM%10]
   n7=$[$RANDOM%10]
   n8=$[$RANDOM%10]
 echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> /tmp/phonenum.txt
 done

demo2:从1000个电话号码中,抽取出5个幸运观众
#!/bin/bash
file=/tmp/phonenum.txt
for i in `seq 5`
  do
  line=`cat $file |wc -l`
  luckline=$[$RANDOM%$line+1]
  luckwho=cat $file|head -n $luckline|tail -1
  echo "幸运观众是:${luckwho:0:3}****${luckwho:7:4}"
  done

抽法2:如果一次被抽到,那么将该观众从文件中删除
#!/bin/bash
file=/tmp/phonenum.txt
for i in `seq 5`
  do
  line=`cat $file |wc -l`
  luckline=$[$RANDOM%$line+1]
  luckwho=cat $file|head -n $luckline|tail -1
  sed -i "/$luckwho/d" $file
  echo "幸运观众是:${luckwho:0:3}****${luckwho:7:4}"
  done

嵌套循环:
1
12
123
1234
12345

#!/bin/bash
for ((y=1;y<=5;y++))
  do
   for ((x=1;x<=$y;x++))
    do
     echo -n $x
    done
  echo
  done

y=1
until [ $y -gt 5 ]
  do
   x=1
   until [ $x -lt $y ]
     do
     echo -n $x
     let x++
     done
   echo
   let y++
  done


5
54
543
5432
54321


作业:
1、将/etc/passwd里的用户进行分类,分为管理员,系统用户,普通用户保存到不同的文件中
2、写一个倒计时脚本,要求显示里2017530日(端午节)的凌晨0点,还有多少天,多少时,多少分,多少秒
3、写一个脚本把一个目录内的所有空文件都删除,最后输出删除文件的个数










版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163943.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月24日 上午9:00
下一篇 2022年7月24日 上午9:16


相关推荐

  • 孙鑫的java_孙鑫java视频教程「建议收藏」

    孙鑫的java_孙鑫java视频教程「建议收藏」近几年来,提到java相信很多人都不陌生了吧,Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网。也正是由于互联网的快速发展,学习java的人也是越来越多了。需要注意的是,java和我们平时学习的其它计算机语言还是有区别的。Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节…

    2022年5月17日
    46
  • 2018目标

    2018目标

    2022年3月13日
    37
  • win10系统显示打印机未连接到服务器,win10系统无法连接到打印机的解决方法

    win10系统显示打印机未连接到服务器,win10系统无法连接到打印机的解决方法很多小伙伴都遇到过win10系统无法连接到打印机的困惑吧,一些朋友看过网上零散的win10系统无法连接到打印机的处理方法,并没有完完全全明白win10系统无法连接到打印机是如何解决的,今天小编准备了简单的解决办法,只需要按照1、右键点击开始菜单,选择弹出菜单中的“控制面板”,2、在控制面板里点击“管理工具”,如果找不到的话先将右上角的查看那方式修改为【小图标】或【大图标】的顺序即可轻松解决…

    2022年6月9日
    71
  • iOS锁屏时钟_ios时钟怎么调

    iOS锁屏时钟_ios时钟怎么调当设备在一定时间内没有触控动作,iOS会锁住屏幕。但有些应用程序是不需要锁住屏幕的,比如游戏,视频这类应用。可以通过设置UIApplication的idleTimerDisabled属性来指定iOS是否锁频://禁用休闲时钟[[UIApplicationsharedApplication]setIdleTimerDisabled:YES]; //也可以使用这种语法

    2026年4月15日
    4
  • Linux 重命名文件和文件夹

    Linux 重命名文件和文件夹目录 1 使用 mv 命令 2 使用 rename 命令 1 使用 mv 命令 mv 命令可以重命名或者移动文件或文件夹 mvAB 将目录 A 重命名为 Bmv a b c 将 a 目录移动到 b 下 并重命名为 cmvabc123 将一个名为 abc 的文件重命名为 123 如果当前目录下也有个 123 的文件的话 这个文件是会将它覆盖的 2 使用 rename 命令 1 版本一 renameold namenew name

    2026年3月20日
    2
  • Python实现经纬度空间点DBSCAN聚类

    Python实现经纬度空间点DBSCAN聚类写在前面博主前期科研工作中 涉及到要对某个地区的一些空间点进行聚类分析 想到读研期间 曾经用 DBSCAN 聚类算法实现了四线激光雷达扫描的三维点云数据聚类 论文题目 基于改进 DBSCAN 算法的激光雷达目标物检测方法 当初用 matlab 实现的 虽说是改进的算法 但改进方法非常原始 DBSCAN 是一种非常实用的密度聚类算法 而地理空间的经纬度点聚类 没有其他维度的信息的话 毫无疑问可以用密度聚类 于是博主重新熟悉了一下算法 并做了一些改进 用 Python 实现 记录在博客里面 编译环境 Python3 7

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号