shell语句for循环
一:常用格式
格式一
for 变量
do
语句
done
格式二
for 变量 in 列表
do
语句
done
格式三
for ((变量=初始值; 条件判断; 变量变化))
do
语句
done
二:实例
1.数字段形式
1 2 3 4 | for i in {1..10} do echo $i done |
结果:
[root@lb02 ~]# sh 2.sh 1 2 3 ......
2.详细列出(字符且项数不多)
1 2 3 4 | for ma in 1 2 3 do echo $ma done |
结果:
[root@lb02 ~]# sh 3.sh 1 2 3
3.对存在的文件进行循环
1 2 3 4 5 | for shname in ` ls *.sh` #此处为反引号,是为了解析其中的命令,反引号也可换成$()。in 后还可以接能获得多个值的命令,也可以接变量和数组。只要 do #返回值为数组形式即可 name=` echo "$shname" | awk -F. '{print $1}' ` echo $name done |
结果:
[root@lb02 ~]# ls 1.sh 2.sh 3.sh 4.sh anaconda-ks.cfg mydir [root@lb02 ~]# sh 4.sh 1 2 3 4
4.查找循环(ls数据量太大的时候也可以用这种方法)
1 2 3 4 5 | for shname in ` find . - type f -name "*.sh" ` do name=` echo "$shname" | awk -F/ '{print $2}' ` echo $name done |
结果:
[root@lb02 ~]# ls 1.sh 2.sh 3.sh 4.sh 5.sh anaconda-ks.cfg mydir [root@lb02 ~]# sh 5.sh 1.sh 2.sh 3.sh 4.sh 5.sh
5.语法循环--有点像C语法,但记得双括号
1 2 3 4 5 6 7 8 | for ((i=1;i<10;i++)) do if ((i%3==0)) then echo $i continue fi done |
结果:
[root@lb02 ~]# sh 6.sh 3 6 9
6.seq形式 起始从1开始
1 2 3 4 5 6 7 8 | for i in ` seq 10` do if ((i%3==0)) then echo $i continue fi done |
结果:
[root@lb02 ~]# sh 7.sh 3 6 9
7.遍历数组
1 2 3 4 5 | array=(a b c) for data in ${array[@]} do echo ${data} done |
结果:
[root@lb02 ~]# sh array.sh a b c
8.从其它文件中获取内容
1 2 3 4 5 | a=$( cat ~ /myfile ) #此处也可以用相对路径 for i in $a do echo $i done |
[root@lb02 ~]# cat myfile a b c
结果:
[root@lb02 ~]# sh 8.sh a b c
9.求等差数列的和
1 2 3 4 5 6 | sum =0 for i in {1..6..2} #也可以用for i in $(seq 1 2 6),seq表示起始数为1,跳跃的步数为2,结束条件值为6。 do let "sum+=i" #let不可省 done echo "sum=$sum" |
结果:
[root@lb02 ~]# sh 9.sh sum=9
10.awk中用for循环
1 2 3 4 5 6 | [root@lb02 ~] # awk 'BEGIN{for(i=1; i<=5; i++) print i}' 1 2 3 4 5 |
11.对每个传参进行操作
1 2 3 4 | for i in "$@" #$#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。 do echo "$i" done |
结果:
[root@lb02 ~]# sh 10.sh 1 2 3 1 2 3
12.类C的for循环计算1~6内所有的奇数之和
1 2 3 4 5 6 | sum =0 for (( i = 1; i <= 6; i = i + 2 )) do let "sum += i" done echo "sum=$sum" |
结果:
[root@lb02 ~]# sh 11.sh sum=9
13.还可以在命令行这样写
1 2 3 4 5 6 7 8 9 10 11 | [root@lb02 ~] # for ((i=0; i<3; ++i)) > do > echo $i > done 0 1 2 [root@lb02 ~] # for ((i=0; i<3; i++)); do echo $i; done 0 1 2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@lb02 ~] # print_args() > { > for arg in "$@" > do > echo $arg > done > } [root@lb02 ~] # print_args 1 2 3 4 1 2 3 4 [root@lb02 ~] # print_args "wo shi machangwei" wo shi machangwei [root@lb02 ~] # print_args wo shi machangwei wo shi machangwei |
14.shell实现类似Python键值对来获取值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | num=(1 2 3 4) str=(a b c d) num_of_num=${ #str[@]} str_num_of() { for ((i=0; i<$num_of_num; ++i)) do if [ "$1" == "${num[i]}" ]; then echo "${str[i]}" fi done } echo $(str_num_of 2) for i in ${num[*]} do echo $i $(str_num_of $i) done |
结果:
[root@lb02 ~]# sh 12.sh b 1 a 2 b 3 c 4 d
15、for中{}可以内容也可以打印出来
1 2 | [root@lb02 ~] # for i in "{1..5}"; do echo $i; done {1..5} |
16、shell计数器
1 2 3 4 5 6 | n=0 for i in a b c do n=` echo ${n} + 1| bc ` echo $n done |
结果:
[root@db01 ~]# sh jishu 1 2 3
1 2 3 4 5 6 7 8 | sum=0 for(( i = 1; i <= 4; i++ )) do let "sum += i" echo $i done echo "sum=$sum" echo $i |
结果:
[root@lb02 ~]# sh ss 1 2 3 4 #内部计数: sum=10 #求和 5 #在for外层,为最大i加1的结果,相当于再循环一次
17、往数组里添加元素。将for循环的变量变成键值的形式,在最外层也能以键值对来取用。
1 2 3 4 5 6 7 8 9 | a=() #初始化数组 num=0 #计数器初始值 for con in a b c #定义数组元素 do a[${num}]=$con #将每个变量形成有角标的数组元素 num=` echo ${num} + 1| bc ` #计数器 done echo ${a[@]} #显示数组a的全部元素 echo ${a[1]} #显示数组a的第二个元素 |
结果:
[root@db01 ~]# sh jishu
a b c
b
18、for变量范围中有其他变量。
1 2 3 4 5 | a=` echo abcde| wc -L` #此处数字变量也可由ls等得出 for i in ` seq 2 $a` #此处不可以用{}的形式 do echo $i done |
结果:
[root@db01 ~]# sh jishu 2 3 4 5
19、shell实现多线程并发执行
1 2 3 4 5 6 7 8 9 10 11 12 | start=`date +%s` for i in {1..10} do { sleep 1 #实际应为10秒,因为启用多线程,所以1秒结束。但是这样对cpu的消耗比较大。 echo $i; } & #将执行的命令放在后台执行 done wait #等待所以子进程结束 stop=`date +%s` echo 总共花费时长:$((${stop}-${start})) |
结果:
[root@db01 ma]# sh 1.sh 7 2 4 8 3 6 9 10 5 1 总共花费时长:1
问题:
1. 怎么用for实现死循环(无限循环)?
2. 比较几种写法的不同:(1) for arg in $* (2) for arg in $@ (3) for arg in "$*" (4) for arg in "$@"
3. 怎么跳出for循环?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?