返回总目录页

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循环?

 

 

posted @   马昌伟  阅读(1249)  评论(0编辑  收藏  举报
编辑推荐:
· 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爆火,是硬核还是营销?
博主链接地址:https://www.cnblogs.com/machangwei-8/
点击右上角即可分享
微信分享提示

目录导航