一文让你通俗易懂的学习会 Bash Shell 中的 for 循环语句(for 的两种语法结构 和 嵌套for循环)


 

        此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:


★ 语法格式分为两类:

# 语法格式 1 —— 带 取值列表 的 for循环语句:

for  varname in 取值列表
do 
 cmd1 ....     
 cmdn ....    
done


——————————————————————————————————————————————————————————————————————————————————————————————

# 语法格式 2 —— 类C语言风格 的 for循环语句:

for((expression1;expression2;expression3))   # expression —— 表达式
do
cmd1..
cmdn..
done

 

1、语法格式 1 的介绍:

for  varname in 取值列表          # 带 取值列表 的for循环
do 
 cmd1 ....     
 cmdn ....    
done

在此语法格式中需要知道几个概念: ① varname、②取值列表、③循环体、④循环次数!

①、varname —— 循环变量名;

②、取值列表 —— 顾名思义就是 循环变量取值的地方;

③、循环体 —— do 和 done 之间的所有语句都称之为 循环体 !(cmd1…cmdN)

④、循环次数 —— 就是 循环体 会循环执行几次?这跟 取值列表里面的元素个数有关,几个元素就执行几次!

       


 

1.1、语法格式 1 的工作原理:

        当 for 循环语句执行时,第一次,Shell 会将 取值列表中的第一个值 赋给 varname(变量)!然后执行循环体;当循环体执行完成之后,Shell 又将 取值列表 中的 第二个 参数赋值给 varname(变量)!然后再去执行循环体!就这样反反复复的 赋值 再执行循环体 来实现循环,直到 取值列表 中的最后一个参数被执行,循环结束!

       


1.2、语法格式 1 的取值列表:

"1、字符串 或 数字 :"  eg: for i in a  b  c  ; 

"2、表示范围:" {1..10}  还可以 {a..j}[a..z} 相当于 {1..26}

"3、文件名:"  /root/*.sh  或  /root/*

"4、命令执行结果:"  格式 $(cmd);eg: $(seq 1 10) 等于 {1..10}

"5、使用脚本本身的变量参数:" eg: $1,$2..$n$*(脚本中的所有参数)
①、字符串:
root@zhengzelin:~# for i in aaa bbb ccc ddd;do echo "这是变量i的值:" $i;done
这是变量i的值: aaa
这是变量i的值: bbb
这是变量i的值: ccc
这是变量i的值: ddd

这样一目了然了吧,对于 for 循环有了一个初步的认识!
②、范围集合:
要求:打印3个随机数! 关于随机数,之前学过,用的是 $RANDOM


方法1(使用 $(cmd) 组合):
[root@www ~]# for i in $(seq 1 3);do echo $RANDOM;done
21634
12193
30169


方法2(使用 {..} 表范围格式):
[root@www ~]# for i in {1..3};do echo $RANDOM;done
31366
13099
32531
[root@www ~]# for i in {a..c};do echo $RANDOM;done
16082
2453
14131

{a..z} 也是表范围的!
[root@www ~]# for i in {a..z};do echo $RANDOM;done | wc -l
26
# 一个26个字母,一共循环26个随机数!

关于 $RANDOM —— bash 中的内建随机数生成器

③、文件名:
root@zhengzelin:~# for i in /root/*;do ls   $i;done
/root/aaa
/root/bbb
/root/adduser.sh
/root/case.sh
/root/filetest.sh
/root/t.sh

或 指定文件格式:
root@zhengzelin:~# for i in /root/*.sh;do ls -a  $i;done
/root/adduser.sh
/root/case.sh
/root/filetest.sh
/root/t.sh
④、命令执行结果:
例如上面举例中的: $(seq 1 10),这些都是命令执行后的结果

eg:
root@zhengzelin:~# for i in $(echo "aaa bbb ccc");do echo $i;done
aaa
bbb
ccc

$(cmd) 的执行结果 作为 变量i 的值!然后循环做完!
⑤、位置变量 及 系统变量:
root@zhengzelin:~# vim  test.sh
#!/bin/bash      
echo "test for.."
echo "this is the first Position variable parameters:" $1
echo "this is the second Position variable parameters:" $2
echo this is all Position variable parameters: $*
for i in $* 
do
echo this is all $i
done

查看执行结果:
root@zhengzelin:~# ./test.sh 1 2 
test for..
this is the first Position variable parameters: 1
this is the second Position variable parameters: 2
this is all Position variable parameters: 1 2
this is all 1
this is all 2

 

2、语法格式 2 的介绍:

for((expression1;expression2;expression3))      # 类 C语言风格 的for循环
do
cmd1..
cmdn..
done

# expression —— 表达式!

       


       

2.1、语法格式 2 的工作原理:

       
        在上面的语法中,for循环语句的条件被 (( )) 包起来 。执行条件分为3部分,由 两个分号 隔开。

expression1: 通常是 条件变量的初始化语句

expression2: 决定是否执行for循环。当expression2的值为0时,执行整个循环体,当expression2的值为非0时,退出for循环体;

expression3: 通常用来改变条件变量的值,例如递增或递减等

2.2、语法格式 2 (( )) 的几个常用用法:

1、((i=1;i<=10;i++)) ; 递增1( 1、2、3....10)
2、((i=10;i>=1;i--)) ; 递减1( 10、9、8....1)

3、((i=1;i<=10;i=i+2));递增2 ( 1、3、...9 )
4、((i=10;i=1;i=i-2));递减2 (10、8....2 )

5、((i=$i;i<=$(($i-1));i++)) :数学运算

①、打印 1 - 100 之间所有的数:
1 - 100:
root@zhengzelin:~# for((i=1;i<=100;i++));do echo $i;done


100 - 1:
root@zhengzelin:~# for((i=100;i>=0;i--));do echo $i;done
②、打印 1 - 100 之间所有奇偶数:
奇数:
root@zhengzelin:~# for((i=1;i<=100;i+=2));do echo $i;done


偶数:
root@zhengzelin:~# for((i=0;i<=100;i+=2));do echo $i;done
③、批量创建文件:
创建文件 a1.txt - a5.txt

首先,共同点是 : a 和 txt ;so

使用 for 列表 格式:
root@zhengzelin:~# for i in $(seq 1 5);do touch a$i.txt;done
root@zhengzelin:~# for i in {1..5};do touch a$i.txt;done


使用 for(()) 格式:
root@zhengzelin:~# for((i=1;i<=5;i++));do touch a$i.txt;done
root@zhengzelin:~# for((i=1;i<=5;i=i+1));do touch a$i.txt;done
④、求出 1-100 之间所有数的和!
root@zhengzelin:~# a=0
root@zhengzelin:~# for((i=0;i<=100;i+=1));do a=$(expr $a + $i);done;echo $a
5050
问:为什么在求和之前要先 定一个变量 a=0 呢???以及上面命令的作用!

答:求和的话 $i 和谁相加?它不可能和自己相加吧!也不能和自己相加!这就用到了a这个变量, $a=0 。(为什么是0呢?因为0不会影响他们的结果啊)

for((i=0;i<=100;i+=1))  # i+=1 等于 i=i+1 等于 i++(都是递增1)
   
a=$(expr $a + $i) ; 开始for循环运算:

当 $a=0,$i=1 时; a=$(expr 0 + 1);得到新的a的值: a=1; (把这个新的值 代入到 下一个算术运算表达式中)

(i 的取值是 0 -100,第一个 i=0,那么下一个 i=1...最后一个 i=100)

当 $a=1,$i=1 时;a=$(expr 1 + 1);得到新的a的值: a=2...(就这样每次把a的新值代入到下一个运算式中..再次得到新a的值)
.....
就这样循环下去,直到当 $i = 100 的时候,执行完 a=$(expr $a + 100) 后,结束循环
使用 bash 命令更直观的解惑:

root@zhengzelin:~# bash -x c.sh 
+ sum=0
+ (( i=0 ))
+ (( i<=3 ))
++ expr 0 + 0
+ sum=0
+ (( i++ ))
+ (( i<=3 ))
++ expr 1 + 0
+ sum=1      # 新的sum值,此刻 sum!=1
+ (( i++ ))
+ (( i<=3 ))
++ expr 2 + 1
+ sum=3
+ (( i++ ))
+ (( i<=3 ))
++ expr 3 + 3
+ sum=6
+ (( i++ ))
+ (( i<=3 ))
+ echo 6
6
⑤、打印 1 -100 之间所有偶数的和:
首先:1 - 100 是范围,然后 是要偶数! 偶数的话,我们可以采用 递加2来实现:

root@zhengzelin:~# sum=0;for((i=0;i<=100;i+=2));do  sum=$(expr $sum + $i);done;echo $sum
2550



那么举一反三,奇数的话,只需要更改 i 的 基础值就好:
root@zhengzelin:~# sum=0;for((i=1;i<=100;i+=2));do  sum=$(expr $sum + $i);done;echo $sum
2500
root@zhengzelin:~# sum=0;for((i=1;i<=100;i=i+2));do  sum=$(expr $sum + $i);done;echo $sum
2500
⑥、给同一个网络的主机发文件:
IP范围: 192.168.100.100   ———— 192.168.100.200
取相同值: 192.168.100.          100-200 使用for循环输出:

1for i in $(seq 100 200)
2for((i=100;i<=200;i++))

eg:
vim test.sh
#!/bin/bash
for((i=100;1<=200;i++))
do
   scp -r filename root@192.168.100.$i:/path
done


这里只是用到了 单个 for 循环,那么 for 循环 里面套多个for循环(for循环的嵌套) 你会吗?
 


注意:按规定的步数进行跳跃的方式实现列表for循环

eg: 实现 1-10 内 奇数的和:
root@zhengzelin:~\# vim test.sh 
#!/bin/bash                                                                                                          
#
#********************************************************
#Author:                     zhengzelin
#Date:                       2020-03-31
#FileName                    test.sh
#QQ:                         xxxxxxxx
#************************************************
sum=0
for i in {1..10..2}
do
  let sum=$sum+$i
done
echo $sum

root@zhengzelin:~# ./test.sh 
25
root@zhengzelin:~# bash -x test.sh 
+ sum=0
+ for i in '{1..10..2}'
+ let sum=0+1
+ for i in '{1..10..2}'
+ let sum=1+3
+ for i in '{1..10..2}'
+ let sum=4+5
+ for i in '{1..10..2}'
+ let sum=9+7
+ for i in '{1..10..2}'
+ let sum=16+9
+ echo 25
25

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

求  1 - 10 中 偶数的和:
root@zhengzelin:~\# vim test.sh 
#!/bin/bash                                                                                                          
#
#********************************************************
#Author:                     zhengzelin
#Date:                       2020-03-31
#FileName                    test.sh
#QQ:                         xxxxxxxx
#************************************************
sum=0
for i in {0..10..2}
do
  let sum=$sum+$i
done
echo $sum


root@zhengzelin:~# ./test.sh 
30
root@zhengzelin:~# bash -x t.sh 
+ sum=0
+ for i in '{0..10..2}'
+ let sum=0+0
+ for i in '{0..10..2}'
+ let sum=0+2
+ for i in '{0..10..2}'
+ let sum=2+4
+ for i in '{0..10..2}'
+ let sum=6+6
+ for i in '{0..10..2}'
+ let sum=12+8
+ for i in '{0..10..2}'
+ let sum=20+10
+ echo 30
30

   

下一篇: for 循环 的高级用法: for循环的嵌套(两个 for循环)…

下下篇:使用 for 循环的嵌套 来实现打印 三角形 !(使用多个for 循环)…

发布了99 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ljlfather/article/details/105229434