zoukankan      html  css  js  c++  java
  • bash 循环写法

    for

    依次访问列表里的元素。

    由空格或回车分隔的串就是列表。

    for var in 列表 ; do
        
    done
    

    列表的生成方式

    • 直接写:

      for num in 1 2 3 4 5 6 ist in ; do
          
      done
      for username in us1 us2 us3 ist in ; do
          
      done
      
    • 展开

      for num in {1..2}; do
          echo $num
      done
      
    • 使用seq命令生成

      seq [OPTION]... LAST
      seq [OPTION]... FIRST LAST
      seq [OPTION]... FIRST INCREMENT LAST
      

      FIRST:起始

      INCREMENT:步长

      LAST:结尾

      例子:

      # seq 2
      1
      2
      # seq 3
      1
      2
      3
      # seq 2 4
      2
      3
      4
      # seq 2 3 9
      2
      5
      8
      
      for n1 in `seq 20 22`; do
          echo -n "$n1"
      done
      
    • 命令的返回值是列表

      ls,cat命令的返回值都是列

      for var in `ls /root`; do
          echo $var
      done
      
      for var in `cat /etc/fstab `; do
          echo $var
      done
      
    • glob也能返回列表

      for var in /etc/pu*; do
          echo $var
      done
      
    • 变量引用:$@,$*

      name=/etc/pu*
      name=`ls -d /etc/p*`
      name=`cat /etc/fstab`
      for var in $name; do
          echo $var
      done
      

    for练习

    1,分别求100以内所有偶数之和,所有奇数之和

    #!/bin/bash
    
    declare -i sum1=0
    declare -i sum2=0
    
    for var in {1..100}; do
        if [ $[var % 2] -eq 0 ]; then
            sum1=$[$sum1+$var]
        else
            sum2=$[$sum2+$var]
        fi
    done
    echo $sum1,$sum2
    

    2,计算当前系统上的所有用户的id之和

    #!/bin/bash
    
    declare -i sum=0
    
    for var in `cat /etc/passwd | cut -d: -f3`; do
        sum=$[$sum+$var]
    done
    echo $sum
    

    3,参数是一个目录,计算此目录下所有文本文件的行数之和,并有多少文本文件

    #!/bin/bash
    
    declare -i sum=0
    declare -i lines=0
    
    #在参数1后面加了/*,也就是取得给定目录下的所有文件
    for var in $1/*; do
    #file命令的返回值,如果是文本文件,则返回值里有字符串ASCII
    #如果是可执行文件,则返回值里有字符串ELF
        if [[ `file $var` =~ ASCII ]]; then
            sum=$[$sum+1]
            #wc -l得到文本文件的行数,使用了重定向
            lines=$[$lines+$[`wc -l < $var`]]
        fi
    done
    
    echo "ascii lines is: $lines"
    echo "acsii file's number is $sum"
    
    

    emacs 生成for代码块的快捷键:c-c c-f

    特殊用法:for ((i=0;i<=100;i++)); do

    #!/bin/bash
    #
    
    declare -i sum=0
    for ((i=0;i<=100;i++)); do
        let sum+=$i
    done
    echo $sum
    

    while

    语法:

    条件为真则进入循环体。

    while condition; do
    
    done
    

    例子:求1到100的整数之和。

    #!/bin/bash
    
    declare -i sum=0
    declare -i i=1
    # -le是小于等于
    while [ $i -le 100 ]; do
        let sum+=$i
        let i++
    done
    echo $sum
    

    emacs 生成while代码块的快捷键:c-c c-w

    特殊用法:读取文件的每一行

    while read VAR; do
    
    done < /path/from/file
    

    例子:找出ID号为偶数的用户,显示其用户名,id和默认shell

    #!/bin/bash
    #
    while read lines ;do
        username=`echo $lines | cut -d: -f1`
        userid=`echo $lines | cut -d: -f3`
        usershell=`echo $lines | cut -d: -f7`
        if [ $[$userid % 2] -eq 0 ]; then
            echo "userid:$userid,username:$username, shell:$usershell"
        fi
    done < /etc/passwd
    

    until

    语法:

    条件为假则进入循环体。

    until condition; do
    
    done
    

    例子:求1到100的整数之和。

    #!/bin/bash
    
    declare -i sum=0
    declare -i i=1
    
    until [ $i -gt 100 ]; do
        let sum+=$i
        let i++
    done
    echo $sum
    

    循环控制

    • continue:结束本次循环
    • break:结束整个循环

    emacs 生成while代码块的快捷键:c-c c-u

    练习:分别使用for,while,until实现

    1,分别求100以内所以偶数之和,100以内所以奇数之和

    • for实现:

      #!/bin/bash
      
      declare -i sum=0
      for i in `seq 0 2 100` ; do
          let sum+=i
      done
      echo $sum
      
      declare -i sum1=0
      for i in `seq 1 2 100` ; do
          let sum1+=i
      done
      echo $sum1
      
    • while实现:

      #!/bin/bash
      
      declare -i i=0
      declare -i sum=0
      while [ $i -le 100 ]; do
          let sum+=i
          let i+=2
      done
      echo $sum
      
      declare -i i1=1
      declare -i sum1=0
      while [ $i1 -le 100 ]; do
          let sum1+=i1
          let i1+=2
      done
      echo $sum1
      
    • unitl实现:

      #!/bin/bash
      
      declare -i i=0
      declare -i sum=0
      until [ $i -gt 100 ]; do
          let sum+=i
          let i+=2
      done
      echo $sum
      
      declare -i i1=1
      declare -i sum1=0
      until [ $i1 -gt 100 ]; do
          let sum1+=i1
          let i1+=2
      done
      echo $sum1
      

    2,创建10个用户,user101~user110,密码同用户名

    • for实现:

      #!/bin/bash
      
      for i in {100..110} ; do
          if `id user$i &> /dev/null` ; then
              echo "user:user$i exist!"
              exit 1
          fi
          #-M选项:不创建家目录
          useradd -M "user$i" &> /dev/null && echo "user$i" | passwd --stdin "user$i" > /dev/null
      done
      
    • while实现:

      #!/bin/bash
      
      declare -i i=100
      while [ $i -le 101 ]; do
          if `id user$i &> /dev/null` ; then
              echo "user:user$i exist!"
              exit 1
          fi
      
          useradd -M "user$i" &> /dev/null && echo "user$i" | passwd --stdin "user$i" > /dev/null
          let i+=1
      done
      

    3,每隔2秒检测ys用户是否登录了,如果发现其登录了,则退出循环。

    #!/bin/bash
    #
    
    while [ true ]; do
        if `who | grep ays &> /dev/null`; then
            break
        fi
        sleep 2
    done
    
    echo `date +"%F %T"` ays logged on >> /tmp/userlogon.log
    

    查看/tmp/userlogon.log

    # cat /tmp/userlogon.log
    2018-05-25 11:29:21 ays logged on
    2018-05-25 11:29:37 ays logged on
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    面向对象编程
    多任务-线程
    浅析IoC框架
    Android:关于声明文件中android:process属性说明
    Android闹钟设置的解决方案
    【转】RelativeLayout和LinearLayout及FrameLayout性能分析
    SurfaceView浅析
    SQLite Vacuum
    SQLiteStatement优化SQLite操作
    基于Android SQLite的升级详解
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12320266.html
Copyright © 2011-2022 走看看