zoukankan      html  css  js  c++  java
  • shell语句for循环

    一:常用格式

    格式一

    for 变量

    do

        语句

    done

    格式二

    for 变量 in 列表

    do

        语句

    done

    格式三

    for ((变量=初始值; 条件判断; 变量变化))

    do

        语句

    done

    二:实例

    1.数字段形式

    for i in {1..10}
     do
        echo $i
     done
    

      结果:

    [root@lb02 ~]# sh 2.sh
    1
    2
    3
    ......

     2.详细列出(字符且项数不多)

    for ma in 1 2 3    
     do
         echo $ma 
     done
    

      结果:

    [root@lb02 ~]# sh 3.sh 
    1
    2
    3

    3.对存在的文件进行循环

    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数据量太大的时候也可以用这种方法)

    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语法,但记得双括号

    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开始

    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.遍历数组

    array=(a b c)
    for data in ${array[@]}
    do  
        echo ${data}  
    done
    

      结果:

    [root@lb02 ~]# sh array.sh 
    a
    b
    c

    8.从其它文件中获取内容

    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.求等差数列的和

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

    [root@lb02 ~]# awk 'BEGIN{for(i=1; i<=5; i++) print i}'
    1
    2
    3
    4
    5
    

    11.对每个传参进行操作

    for i in "$@"      #$#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。  
    do  
        echo "$i"  
    done
    

      结果:

    [root@lb02 ~]# sh 10.sh 1 2 3
    1
    2
    3

    12.类C的for循环计算1~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.还可以在命令行这样写

    [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
    
    [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键值对来获取值

    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中{}可以内容也可以打印出来

    [root@lb02 ~]# for i in "{1..5}"; do echo $i; done  
    {1..5}
    

    16、shell计数器

    n=0
    for i in a b c
    do
     n=`echo ${n} + 1|bc`
     echo $n
    done
    

      结果:

    [root@db01 ~]# sh jishu 
    1
    2
    3
    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循环的变量变成键值的形式,在最外层也能以键值对来取用。

    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变量范围中有其他变量。

    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实现多线程并发执行

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

     

  • 相关阅读:
    List内存分配
    《深入理解JAVA虚拟机》笔记1
    oracle(三)
    常见排序算法
    C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
    C++ Primer 有感(异常处理)(四)
    C++ Primer 有感(异常处理)(三)
    C++ Primer 有感(异常处理)(二)
    C++ Primer 有感(异常处理)
    C++ Primer 有感(多重继承与虚继承)
  • 原文地址:https://www.cnblogs.com/machangwei-8/p/8457496.html
Copyright © 2011-2022 走看看