此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
# 语法格式 1 —— 带 取值列表 的 for循环语句:
for varname in 取值列表
do
cmd1 ....
cmdn ....
done
——————————————————————————————————————————————————————————————————————————————————————————————
# 语法格式 2 —— 类C语言风格 的 for循环语句:
for((expression1;expression2;expression3)) # expression —— 表达式
do
cmd1..
cmdn..
done
for varname in 取值列表 # 带 取值列表 的for循环
do
cmd1 ....
cmdn ....
done
在此语法格式中需要知道几个概念: ① varname、②取值列表、③循环体、④循环次数!
①、varname —— 循环变量名;
②、取值列表 —— 顾名思义就是 循环变量取值的地方;
③、循环体 —— do 和 done 之间的所有语句都称之为 循环体 !(cmd1…cmdN)
④、循环次数 —— 就是 循环体 会循环执行几次?这跟 取值列表里面的元素个数有关,几个元素就执行几次!
当 for 循环语句执行时,第一次,Shell 会将 取值列表中的第一个值 赋给 varname(变量)!然后执行循环体;当循环体执行完成之后,Shell 又将 取值列表 中的 第二个 参数赋值给 varname(变量)!然后再去执行循环体! …就这样反反复复的 赋值 再执行循环体 来实现循环,直到 取值列表 中的最后一个参数被执行,循环结束!
"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
for((expression1;expression2;expression3)) # 类 C语言风格 的for循环
do
cmd1..
cmdn..
done
# expression —— 表达式!
在上面的语法中,for循环语句的条件被 (( )) 包起来 。执行条件分为3部分,由 两个分号 隔开。
expression1: 通常是 条件变量的初始化语句;
expression2: 决定是否执行for循环。当expression2的值为0时,执行整个循环体,当expression2的值为非0时,退出for循环体;
expression3: 通常用来改变条件变量的值,例如递增或递减等。
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:
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
奇数:
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
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 是范围,然后 是要偶数! 偶数的话,我们可以采用 递加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循环输出:
1、for i in $(seq 100 200)
2、 for((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循环的嵌套) 你会吗?
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 循环)…