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

    一shell脚本for循环语句

    (一)for循环语句介绍

    循环执行:将某代码段重复运行多次,重复运行多少次。也就是循环次数事先已知或者循环次数事先未知,有进入条件和退出条件。


    循环语句有for, while, until

    查看帮助文档,有两种语法

    因为NAME是变量名,不加$

    [root@centos7 ~]# type  for
    for is a shell keyword
    [root@centos7 ~]# help for
    for: for NAME变量名  [in WORDS ... ] ; do COMMANDS; done

    0420变量值就是列表中的某个值。有几个单词就会执行几遍
    Execute commands for each member in a list. The `for' loop executes a sequence of commands for each member in a list of items. If `in WORDS ...;' is not present, then `in "$@"' is assumed. For each element in WORDS, NAME is set to that element, and the COMMANDS are executed. Exit Status: Returns the status of the last command executed. for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done Arithmetic for loop. Equivalent to (( EXP1 )) while (( EXP2 )); do COMMANDS (( EXP3 )) done EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is omitted, it behaves as if it evaluates to 1. Exit Status: Returns the status of the last command executed.

    对比case,如果name是变量名,要加$

    [root@centos7 ~]# help  case
    case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
        Execute commands based on pattern matching.
        
        Selectively execute COMMANDS based upon WORD matching PATTERN.  The
        `|' is used to separate multiple patterns.
        
        Exit Status:
        Returns the status of the last command executed.

    (1)第1种语法——变量取值型

    for 变量名 in 列表;do


    循环体


    done


    执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。

    在此结构中"in变量取值列表”可以省略,省略时相当于in "$@"
    也就是使用for i就相当于使用for i in "$@"
    在这种for循环语句语法中, for关键字后面会有一个“变量名”,
    变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),
    每次仅取一个,然后进入循环(do和done之间的部分)
    执行循环内的所有指令,当执行到done时结束本次循环。
    之后, “变量名”再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,
    当执行到done时结束返回,以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。
     
     
     
     
     
     
    for循环执行流程图
     
     

     

    (2)第2种语法——C语言for循环语句

    第二种for循环语句称为C语言型for循环语句,其语法结构如下:
     
    for ( (exp1; exp2; exp3))
    do
    指令...
    done
     
    for关键字后的双括号内是三个表达式,第一个是变量初始化(例如: i=0),
     
    第二个为变量的范围(例如: i<100 ),第三个为变量自增或自减(例如: i++)。
     
    当第一个表达式的初始化值符合第二个变量的范围时,就进入循环执行;当条件不满足时就退出循环。
     

    (二)列表生成方式

    (1)直接给出列表元素

    [root@centos73 shell_scripts]# vim  for.sh
    [root@centos73 shell_scripts]# bash  for.sh 
    num  is  1
    num  is  2
    num  is  3
    num  is  4
    [root@centos73 shell_scripts]# cat  for.sh 
    #!/bin/bash
    #Author:wang
    for   num  in  1  2  3 4
    #写完4个数就会执行4次循环
    
    do 
         echo   "num  is  $num"
    done


    (2)整数列表

     
     {start..end},{start..end..step}

    利用大括号{ }生成数字序列

    [root@centos73 shell_scripts]# vim  for1.sh 
    [root@centos73 shell_scripts]# bash  for1.sh 
    num  is  1
    num  is  2
    num  is  3
    num  is  4
    [root@centos73 shell_scripts]# cat  for1.sh 
    #!/bin/bash
    #Author:wang
    for   num  in  {1..4}
    #写完4个数就会执行4次循环
    
    do 
         echo   "num  is  $num"
    done
    [root@centos73 shell_scripts]# cat  for1.sh 
    #!/bin/bash
    #Author:wang
    for   num  in  {a..g}
    
    
    do 
         echo   "num  is  $num"
    done
    [root@centos73 shell_scripts]# bash  for1.sh 
    num  is  a
    num  is  b
    num  is  c
    num  is  d
    num  is  e
    num  is  f
    num  is  g

    {start..end..step}

    [root@centos73 shell_scripts]# cat  for1.sh 
    #!/bin/bash
    #Author:wang
    for   num  in  {10..2..1}从10到2递减,步长是1
    
    
    do 
         echo   "num  is  $num"
    done
    [root@centos73 shell_scripts]# vim  for1.sh 
    [root@centos73 shell_scripts]# bash  for1.sh 
    num  is  10
    num  is  9
    num  is  8
    num  is  7
    num  is  6
    num  is  5
    num  is  4
    num  is  3
    num  is  2

    (3)使用seq生成数字序列

    $(seq [start [step]] end)

    [root@centos73 shell_scripts]# bash   for_seq.sh
    1
    3
    5
    7
    9
    11
    13
    15
    17
    [root@centos73 shell_scripts]# cat  for_seq.sh
    #!/bin/bash
    #Author=wang
    for  i  in  `seq  1  2 18`
    do
      echo  $i
    done
    [root@centos73 shell_scripts]# 

    注意如果是倒序,那么步长前面要加上-

    [root@centos73 shell_scripts]# bash  for_seq_1.sh
    10
    8
    6
    4
    2
    0
    [root@centos73 shell_scripts]# cat  for_seq_1.sh
    #!/bin/bash
    #Author=wang
    for  i  in  `seq  10  -2 0`
    do
      echo  $i
    done
    [root@centos73 shell_scripts]# seq  1  5  66
    1
    6
    11
    16
    21
    26
    31
    36
    41
    46
    51
    56
    61
    66

    注意如果是倒序显示步长要加负号

    [root@centos73 shell_scripts]# seq   66   5  1
    [root@centos73 shell_scripts]# seq   66   -5  1
    66
    61
    56
    51
    46
    41
    36
    31
    26
    21
    16
    11
    6
    1
    [root@centos73 shell_scripts]#
    bash for_3sum.sh 3367 [root@centos73 shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ $[i%3] -ne 0 ]; then let sum+=i fi done echo $sum [root@centos73 shell_scripts]# vim for_3sum.sh [root@centos73 shell_scripts]# bash for_3sum.sh 3367 [root@centos73 shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ "$[i%3]" -ne 0 ]; then let sum+=i fi done echo $sum

    (4)返回列表的命令$(COMMAND)

    注意要加上反引号

    [root@centos73 shell_scripts]# cat   for_command.sh
    #!/bin/bash
    #Author=wang
    for  i  in  `ls  /etc`;do
        echo  $i
    done
    [root@centos73 shell_scripts]# bash  for_command.sh   | wc
        188     188    1803
    [root@centos73 shell_scripts]# bash  for_command.sh   | head
    adjtime
    aliases
    aliases.db
    alternatives
    anacrontab
    asound.conf
    at.deny
    audisp
    audit
    bash_completion.d
    [root@centos73 shell_scripts]# bash  for_command.sh   | tail
    vmware-tools
    vsftpd
    wpa_supplicant
    X11
    xdg
    xinetd.d
    yum
    yum.conf
    yum.repos_bak
    yum.repos.d
    [root@centos73 shell_scripts]# bash  command1.sh 
    filename is /root/shell_scripts/1.sh
    filename is /root/shell_scripts/2.sh
    filename is /root/shell_scripts/backup1.sh
    filename is /root/shell_scripts/backup.sh
    filename is /root/shell_scripts/case1.sh
    filename is /root/shell_scripts/case.sh
    filename is /root/shell_scripts/command1.sh
    filename is /root/shell_scripts/for1.sh
    filename is /root/shell_scripts/for_3sum.sh
    filename is /root/shell_scripts/for.sh
    filename is /root/shell_scripts/for_sum.sh
    [root@centos73 shell_scripts]# cat command1.sh 
    #!/bin/bash
    #Author:wang
    
    for  filename    in   `ls    /root/shell_scripts/*.sh`;do
         echo  filename  is  $filename
    done
    [root@centos73 shell_scripts]# bash  command1.sh 
    filename is /root
    filename is /root/shell_scripts/1.sh
    filename is /root/shell_scripts/2.sh
    filename is /root/shell_scripts/backup1.sh
    filename is /root/shell_scripts/backup.sh
    filename is /root/shell_scripts/case1.sh
    filename is /root/shell_scripts/case.sh
    filename is /root/shell_scripts/command1.sh
    filename is /root/shell_scripts/for1.sh
    filename is /root/shell_scripts/for_3sum.sh
    filename is /root/shell_scripts/for.sh
    filename is /root/shell_scripts/for_sum.sh
    [root@centos73 shell_scripts]# cat command1.sh 
    #!/bin/bash
    #Author:wang
    
    for  filename    in   ~  /root/shell_scripts/*.sh;do
         echo  filename  is  $filename
    done

    (5)使用使用通配符glob生成列表,如:*.sh

    [root@centos73 shell_scripts]# bash  command1.sh 
    filename is /root
    filename is /root/shell_scripts/1.sh
    filename is /root/shell_scripts/2.sh
    filename is /root/shell_scripts/backup1.sh
    filename is /root/shell_scripts/backup.sh
    filename is /root/shell_scripts/case1.sh
    filename is /root/shell_scripts/case.sh
    filename is /root/shell_scripts/command1.sh
    filename is /root/shell_scripts/for1.sh
    filename is /root/shell_scripts/for_3sum.sh
    filename is /root/shell_scripts/for.sh
    filename is /root/shell_scripts/for_sum.sh
    [root@centos73 shell_scripts]# cat command1.sh 
    #!/bin/bash
    #Author:wang
    
    for  filename    in   ~  /root/shell_scripts/*.sh;do
         echo  filename  is  $filename
    done



    [root@centos73 shell_scripts]# bash  command1.sh 
    filename is /root/shell_scripts/1.sh
    filename is /root/shell_scripts/2.sh
    filename is /root/shell_scripts/backup1.sh
    filename is /root/shell_scripts/backup.sh
    filename is /root/shell_scripts/case1.sh
    filename is /root/shell_scripts/case.sh
    filename is /root/shell_scripts/command1.sh
    filename is /root/shell_scripts/for1.sh
    filename is /root/shell_scripts/for_3sum.sh
    filename is /root/shell_scripts/for.sh
    filename is /root/shell_scripts/for_sum.sh
    [root@centos73 shell_scripts]# cat command1.sh 
    #!/bin/bash
    #Author:wang
    
    for  filename    in   `ls    /root/shell_scripts/*.sh`;do
         echo  filename  is  $filename
    done
    [root@centos73 shell_scripts]# cat   for_*sh.sh
    #!/bin/bash
    #Author=wang
    for  i  in   "*.sh";do
       echo     this  is  $i  
    done
    [root@centos73 shell_scripts]# bash   for_*sh.sh
    this is 100sum_100.sh 19_1.1.sh 19_1.sh 19_2.sh 1.sh 2.sh 33.sh 34.sh 5.sh argsnum1.sh argsnum.sh array.sh a.sh backup.sh break.sh case_1.sh case1.sh case.sh checkdisk.sh checkint.sh color_black.sh color_brown.sh color_green.sh color_rad.sh color.sh color_yellow.sh command1.sh continue.sh copy_cmd.sh crack_passwords.sh create_user1.sh createuser_1.sh createuser2.sh create_user.sh createuser.sh dadengyao.sh dengyao.sh diskcheck.sh equicrural_triangle.sh excute.sh factorial.sh file_KS.sh filetype.sh for1.sh for_3sum.sh for_command.sh for_seq_1.sh for_seq.sh for.sh for_*sh.sh for_sum.sh func1.sh func2.sh func3.sh gecos.sh guess_digit_endlessloop1.sh guess_digit_endlessloop.sh guess_digit.sh host_online.sh isoscelestriangle_2.sh isoscelestriangle.sh killcrackers.sh killcrackers_while.sh login.sh log.sh matrix.sh monitor_connections1.sh monitor_connections.sh nine_nine_multiplication_table.sh nine*nine_multiplication_table.sh nologin.sh randhtml_sedway.sh randhtml.sh randhtml_trmethod.sh rand_max_min1.sh rand_max_min.sh random_for.sh random_while.sh rectangle.sh scan_ip1.sh scan_ip_for.sh scan_ip.sh scan_ip_while.sh score.sh select_quit1.sh select_quit.sh sum_100_1.sh sum_100.sh sum.sh trap_9signal.sh trap.sh triangle1.sh triangle.sh triangle_tree.sh use_exp.sh user_passwd.sh while_read_users.sh yesorno_case.sh yesorno_if.sh yesorno.sh

    (6)变量引用:$@, $*

    [root@centos73 shell_scripts]# cat  for2.sh
    #!/bin/bash
    #Author=wang
    for  i  in  `ls   $@`;do
        echo  $i
    done
    [root@centos73 shell_scripts]# bash for2.sh | wc
        117     118    1589
    [root@centos73 shell_scripts]# bash for2.sh | head 
    100sum_100.sh
    19_1.1.sh
    19_1.sh
    19_2.sh
    1.sh
    2.sh
    33.sh
    34.sh
    5.sh
    argsnum1.sh
    [root@centos73 shell_scripts]# bash for2.sh |  tail
    trap.sh
    triangle1.sh
    triangle.sh
    triangle_tree.sh
    use_exp.sh
    user_passwd.sh
    while_read_users.sh
    yesorno_case.sh
    yesorno_if.sh
    yesorno.sh

    二for循环示例

    (一)求和1-100的偶数

    完整脚本

    [root@centos73 shell_scripts]# cat  for_sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {2..100..2}
    
    
    do 
         let  sum+=i
    done
    echo  $sum

    执行结果

    [root@centos73 shell_scripts]# bash  for_sum.sh 
    2550

    脚本解析

    sum=0 对变量进行定义,初始值为0

    let sum+=i 表示变量进行自增,相当于sum=sum+i

     下面是更容易理解的写法

    [root@centos73 shell_scripts]# cat  for_sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {2..100..2}
    
    
    do 
         let  sum=sum+i
    done
    echo  $sum
    [root@centos73 shell_scripts]# bash  for_sum.sh 
    2550

     因为是一个整体,要使用中括号

    [root@centos73 shell_scripts]# bash  for_sum.sh 
    2550
    [root@centos73 shell_scripts]# cat  for_sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {2..100..2}
    
    
    do 
         let  sum=$[sum+i]
    done
    echo  $sum

     表示使用双括号括起来

    [root@centos73 shell_scripts]# cat  for_sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {2..100..2}
    
    do 
         let  sum=$((sum+i))
    done
    echo  $sum
    [root@centos73 shell_scripts]# bash  for_sum.sh 
    2550

    (二)求1到100被3整除的数字相加的和

    把奇数偶数都加起来

    求1到100被3整除的数字相加的和

    和上面的脚本使用同样的套路

    [root@centos73 shell_scripts]# echo   {3..100..3}
    3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
    [root@centos73 shell_scripts]# cp    for_sum.sh   for_3sum.sh 
    [root@centos73 shell_scripts]# vim  for_3sum.sh 
    [root@centos73 shell_scripts]# bash  for_3sum.sh 
    1683
    [root@centos73 shell_scripts]# cat  for_3sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {3..100..3}
    
    
    do 
         let  sum=$((sum+i))
    done
    echo  $sum

    (三)求1到100不能被3整除的数字相加的和

    判断对3取余数。

    不等于有两种写法:

    1[ ! "$yu" -eq 0 ]

    2 [ "$yu" -ne 0 ]

    法1:

    [root@centos73 shell_scripts]# bash   for_3sum.sh 
    3367
    [root@centos73 shell_scripts]# cat   for_3sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {1..100};do
       yu=$[i%3] 
       if  [   ! "$yu"   -eq  0   ]; then
    #注意这里是变量值最好加上双引号,不加也可以的。
    let sum+=i fi done echo $sum

    法2:

    [root@centos73 shell_scripts]# bash    for_3sum.sh 
    3367
    [root@centos73 shell_scripts]# cat   for_3sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  {1..100};do
       yu=$[i%3] 
       if  [    "$yu"   -ne  0   ]; then
       
       let  sum+=i
    
       fi
    #注意写脚本要养成良好的习惯,比如缩进要美观。
    done echo $sum
    [root@centos73 shell_scripts]# bash    for_3sum.sh 
    3367
    [root@centos73 shell_scripts]# cat      for_3sum.sh 
    #!/bin/bash
    #Author:wang
    sum=0
    for   i  in  {1..100};do
       yu=$[i%3] 
       if  [    $yu   -ne  0   ]; then
       
       let  sum+=i
    
       fi
    #注意写脚本要养成良好的习惯,比如缩进要美观。
    
    done
    echo  $sum

    法3

    [root@centos73 shell_scripts]# bash    for_3sum.sh 
    3367
    [root@centos73 shell_scripts]# cat    for_3sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  `seq 1  100`;do
       if  [    $[i%3]   -ne  0   ]; then
       
       let  sum+=i
    
    fi
    done
    echo  $sum
    [root@centos73 shell_scripts]# vim  for_3sum.sh 
    [root@centos73 shell_scripts]# bash    for_3sum.sh 
    3367
    [root@centos73 shell_scripts]# cat      for_3sum.sh 
    #!/bin/bash
    #Author:wang
    
    sum=0
    for   i  in  `seq 1  100`;do
       if  [    "$[i%3]"   -ne  0   ]; then
       
       let  sum+=i
    
    fi
    done
    echo  $sum

    (四)添加10个用户user91-user100,密码为8位随机字符

    创建用户,并且每个用户设置初始口令,口令是随机的,并且放到文件里面。

     具体问题可以表现为添加10个用户user91-user100,密码为8位随机字符

    完整脚本

    [root@centos73 shell_scripts]# cat   user_add.sh 
    #!/bin/bash
    #Author=wang
    for i in `seq  91  100` ; do
        username=user$i
        useradd  $username
        echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null
    done
    echo "finished"

    执行结果

    [root@centos73 shell_scripts]# bash user_add.sh 
    finished
    [root@centos73 shell_scripts]# cat  /etc/passwd |  tail
    user91:x:1038:1038::/home/user91:/bin/bash
    user92:x:1039:1039::/home/user92:/bin/bash
    user93:x:1040:1040::/home/user93:/bin/bash
    user94:x:1041:1041::/home/user94:/bin/bash
    user95:x:1042:1042::/home/user95:/bin/bash
    user96:x:1043:1043::/home/user96:/bin/bash
    user97:x:1044:1044::/home/user97:/bin/bash
    user98:x:1045:1045::/home/user98:/bin/bash
    user99:x:1046:1046::/home/user99:/bin/bash
    user100:x:1047:1047::/home/user100:/bin/bash
    [root@centos73 shell_scripts]# 
    [root@centos73 shell_scripts]# cat  /etc/shadow  | tail
    user91:$6$YCyBiaF/$vovuieWrGWXwhHpRwsuJc85JOlFwvrUG/hNiPyLsJkHgWQG2v4oTE.B/CRANjcOhDkHlylH3iBG4bggmzstO40:18076:0:99999:7:::
    user92:$6$mxAMFuM1$.PqkWeHq231BmmnYcglitPkK/b4KOTcwLkO.S7isn9TA6ToN/sFR5ASwVF9HCHilEArql5R1Z4md6.auRaYj..:18076:0:99999:7:::
    user93:$6$Ga0/IYjR$TfriwLrqxYsdTlfoRRDNDn8gFwajOkxc5McuxTwoIKGAgWrI8NiKA6ASi4IdYuI7iQ/c2LL4mAte/JCj8juS0.:18076:0:99999:7:::
    user94:$6$E9mnyuH7$HS/TqWuhn8E8DX/ghu2SSOohcJU4LfACYg/hmrW9KIc4wZlsN5e.1.Q1ezNSY/w7WyRYYV2c6A2ofUBau/Csj1:18076:0:99999:7:::
    user95:$6$J.ljQLDk$6NvXXxx58y7487X0yMIQneF0dZKaqswiWigTu9xwJ1njIQmijvrhCkpxPL6ITJGdMB/j8.tYddIzMcUwWGnUv0:18076:0:99999:7:::
    user96:$6$uomIKnzW$9Llzo.qKU9rwcOpU68B7Sml28HUkM1AY06D1k7q7dpITxCdY3IFWWrK11tpwa6SVv4Z.lOiZ.0qgwaq/MNrnz0:18076:0:99999:7:::
    user97:$6$NRvTnViz$11cdhUq/9eVRj2SX85HrA/pNyYwqNsNOSObShmBljygjb9wzEZaJ8nPim8ZIGum.DUgG1ni2N3OgukKJmXYbI.:18076:0:99999:7:::
    user98:$6$40KBqdzU$.zsRi7sIxmVd4NAH7v5UYiQmvTxNlBMjKrddE3li/dtMxoS6TUHq0mK7XQRu.j6p7WjIxhkOZRmJULDssvEwB0:18076:0:99999:7:::
    user99:$6$y2efTk7A$4e4IX9muy30fO6Vv2Q75sAPCrY1XDZecEqxV6f7ZJJPg4V6FpVvIV/lamVaAiSnMQtL1LtGPbSYOu3KWReVFZ1:18076:0:99999:7:::
    user100:$6$tlPd3FrP$74gH4aqmlZ3xvp3TbaHSlWMkuDHDVJpr2XARz0n46Wf7Ni3zk9Eei83NhZISw64NvjI/a.YaM5y7d0ypPrrDw.:18076:0:99999:7:::

    脚本解析

    生成随机口令并且作为创建用户的口令

    把改口令成功的提示放到黑洞里面去。

     echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null
    [root@centos73 shell_scripts]# openssl rand -base64 10
    Ey0PRDELAhuCfw==
    [root@centos73 shell_scripts]# openssl rand -base64 10
    Th1mFK8i95hJOQ==
    [root@centos73 shell_scripts]# openssl rand -base64 
    Usage: rand [options] num
    where options are
    -out file             - write to file
    -engine e             - use engine e, possibly a hardware device.
    -rand file:file:... - seed PRNG from files
    -base64               - base64 encode output
    -hex                  - hex encode output

    提示符和命令都打印出来了

    head -c 8表示获取前几个字节

    [root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8
    bZ4p1m1N[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8
    4z3GSMHZ[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8
    W2c+6e/b[root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo 
    qBPnSsJt

    只显示命令的结果,在命令后面加上echo就可以了

    [root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo 
    cQJIkYwR
    [root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo 
    W+EX9dLc
    [root@centos73 shell_scripts]# openssl rand -base64 10| head -c 8;echo 
    id5+GUME
    [root@centos73 shell_scripts]# cat  for1.sh  -A
    #!/bin/bash$
    #Author:wang$
    for   num  in  {10..2..1}$
    #M-eM-^FM-^YM-eM-.M-^L4M-dM-8M-*M-fM-^UM-0M-eM-0M-1M-dM-<M-^ZM-fM-^IM-'M-hM-!M-^L4M-fM-,M-!M-eM->M-*M-gM-^NM-/$
    $
    do $
         echo   "num  is  $num"$
    done$
    [root@centos73 shell_scripts]# cat  for1.sh
    #!/bin/bash
    #Author:wang
    for   num  in  {10..2..1}
    #写完4个数就会执行4次循环
    
    do 
         echo   "num  is  $num"
    done

    (五)定义网段的IP地址,测试其在是否开机启动

    完整脚本

    [root@centos73 shell_scripts]# cat   scan_ip.sh 
    #!/bin/bash
    #Author=wang
    net=192.168.137
    for i  in  {1..6};do
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up
            echo  $net.$i  >>  /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi
    done
    
    
    #如果ping通了就显示其为开机的,并且放到文件里面去。
    #如果ping不通就执行下一次循环。

    执行结果

    [root@centos73 shell_scripts]# vim   scan_ip.sh
    [root@centos73 shell_scripts]# bash  scan_ip.sh 
    192.168.137.1 is up
    192.168.137.2 is down
    192.168.137.3 is down
    192.168.137.4 is down
    192.168.137.5 is down
    192.168.137.6 is down
    

    脚本解析

    net=192.168.137表示网络位,子网掩码是24

    主机位for i in {1..6};do,我只选取了几台主机

    ping -c1 -w1   $net.$i 因为涉及两个变量,都要加上$

     

     在运行的其实是网关

    [root@centos73 shell_scripts]# cat  /app/ip.log 
    192.168.137.1

    bug1: 

    脚本的执行效率不高,解决办法就是在后台执行

    [root@centos73 shell_scripts]# ping  192.168.137.1    -c3    &
    [1] 1288
    [root@centos73 shell_scripts]# PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data.
    64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.190 ms
    64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.091 ms
    64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.158 ms
    
    --- 192.168.137.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2000ms
    rtt min/avg/max/mdev = 0.091/0.146/0.190/0.042 ms

    bug2:

     在后台执行不回车不会退出来,在脚本里面也是一样的

    [root@centos73 shell_scripts]# ping  192.168.137.1    -c3    &   wait
    [1] 1319
    PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data.
    64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.529 ms
    64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.131 ms
    64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.111 ms
    
    --- 192.168.137.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2001ms
    rtt min/avg/max/mdev = 0.111/0.257/0.529/0.192 ms
    [1]+  Done                    ping 192.168.137.1 -c3
    [root@centos73 shell_scripts]# cat  scan_ip.sh 
    #!/bin/bash
    #Author=wang
    net=192.168.137
    for i  in  {1..6};do
        {
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up
            echo  $net.$i  >>  /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi  }&
    done
    
    
    
    
    
    [root@centos73 shell_scripts]# 192.168.137.1 is up
    192.168.137.2 is down
    192.168.137.3 is down
    192.168.137.6 is down
    192.168.137.5 is down
    192.168.137.4 is down
    ^C

    解决办法加上wait

    现在执行效率提高了并且会退出

    [root@centos73 shell_scripts]# bash  scan_ip.sh 
    192.168.137.1 is up
    192.168.137.2 is down
    192.168.137.4 is down
    192.168.137.3 is down
    192.168.137.5 is down
    192.168.137.6 is down
    [root@centos73 shell_scripts]# cat  scan_ip.sh 
    #!/bin/bash
    #Author=wang
    net=192.168.137
    for i  in  {1..6};do
        {
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up
            echo  $net.$i  >>  /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi  }&
    done
    wait
    
    #如果ping通了就显示其为开机的,并且放到文件里面去。
    #如果ping不通就执行下一次循环。

    bug3:

    因为前面多次执行了脚步,在文件里面会生成重复的内容

    [root@centos73 shell_scripts]# cat  /app/ip.log 
    192.168.137.1
    192.168.137.1
    192.168.137.1

    解决办法在脚本的第1行先清空文件内容?

    [root@centos73 shell_scripts]# bash  scan_ip.sh 
    192.168.137.1 is up
    192.168.137.6 is down
    192.168.137.5 is down
    192.168.137.2 is down
    192.168.137.4 is down
    192.168.137.3 is down
    [root@centos73 shell_scripts]# cat  /app/ip.log 
    192.168.137.1
    [root@centos73 shell_scripts]# cat   scan_ip.sh 
    #!/bin/bash
    #Author=wang
    
    > /app/ip.log
    net=192.168.137
    for i  in  {1..6};do
        {
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up
            echo  $net.$i  >>  /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi  }&
    done
    wait
    
    #如果ping通了就显示其为开机的,并且放到文件里面去。
    #如果ping不通就执行下一次循环。

     查看开机运行的主机的信息

    [root@centos73 shell_scripts]#   nmap    -v  -A   192.168.137.1
    
    Starting Nmap 6.40 ( http://nmap.org ) at 2019-02-09 23:35 CST
    NSE: Loaded 110 scripts for scanning.
    NSE: Script Pre-scanning.
    Initiating ARP Ping Scan at 23:35
    Scanning 192.168.137.1 [1 port]
    Completed ARP Ping Scan at 23:35, 0.01s elapsed (1 total hosts)
    Initiating Parallel DNS resolution of 1 host. at 23:35
    Completed Parallel DNS resolution of 1 host. at 23:35, 0.08s elapsed
    Initiating SYN Stealth Scan at 23:35
    Scanning 192.168.137.1 [1000 ports]
    Discovered open port 53/tcp on 192.168.137.1
    Completed SYN Stealth Scan at 23:35, 0.14s elapsed (1000 total ports)
    Initiating Service scan at 23:35
    Scanning 1 service on 192.168.137.1
    Completed Service scan at 23:35, 1.24s elapsed (1 service on 1 host)
    Initiating OS detection (try #1) against 192.168.137.1
    Retrying OS detection (try #2) against 192.168.137.1
    NSE: Script scanning 192.168.137.1.
    Initiating NSE at 23:35
    Completed NSE at 23:35, 5.17s elapsed
    Nmap scan report for 192.168.137.1
    Host is up (0.047s latency).
    Not shown: 999 closed ports
    PORT   STATE SERVICE    VERSION
    53/tcp open  tcpwrapped
    MAC Address: 00:50:56:E2:3D:B6 (VMware)
    Aggressive OS guesses: Microsoft Windows 7 Enterprise (93%), Microsoft Windows XP SP3 (93%), DD-WRT v24-sp2 (Linux 2.4.37) (91%),
    DVTel DVT-9540DW network camera (91%), Linux 3.2 (90%), BlueArc Titan 2100 NAS device (89%), Brother HL-5170DN printer (88%),
    Pirelli DP-10 VoIP phone (88%), Aethra Starvoice 1042 ADSL router (87%), Brother HL-1870N printer (87%) No exact OS matches for host (test conditions non-ideal). Network Distance: 1 hop TCP Sequence Prediction: Difficulty=257 (Good luck!) IP ID Sequence Generation: Incremental TRACEROUTE HOP RTT ADDRESS 1 46.57 ms 192.168.137.1 NSE: Script Post-scanning. Read data files from: /usr/bin/../share/nmap OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.12 seconds Raw packets sent: 1044 (49.132KB) | Rcvd: 1036 (42.012KB)

    法2:

    把网段写死了,设置要扫描的网段是变化的,或者说是交互式的。

    如果用户不是输入IP地址,那就要温馨提示请输入正确的地址

    判断是否是IP地址可以使用正则表达式

    [root@centos73 shell_scripts]# bash  scan_ip.sh 
    192.168.137.1 is up
    192.168.137.4 is down
    192.168.137.2 is down
    192.168.137.6 is down
    192.168.137.3 is down
    192.168.137.5 is down
    [root@centos73 shell_scripts]# cat  /app/ip.log 
    192.168.137.1 is up
    [root@centos73 shell_scripts]# cat  scan_ip.sh 
    #!/bin/bash
    #Author=wang
    
    > /app/ip.log
    net=192.168.137
    for i  in  {1..6};do
        {
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up  |  tee   -a   /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi  }&
    done
    wait
    
    #如果ping通了就显示其为开机的,并且放到文件里面去。
    #如果ping不通就执行下一次循环。

    ip="114.122.2.255";[[ "$ip" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] && echo true ||echo false

    [root@centos73 shell_scripts]# bash  scan_ip.sh 
    please   input   the   network(eg:192.168.137.0):1.1.1.1
    scan_ip.sh: line 8: syntax error near unexpected token `||'
    scan_ip.sh: line 8: `||    {  echo   "please  input   a  legal   IP";exit 1 ;}'
    
    [root@centos73 shell_scripts]# cat  scan_ip.sh 
    #!/bin/bash
    #Author=wang
    
    > /app/ip.log
    net=192.168.137
    read  -p      "please   input   the   network(eg:192.168.137.0):" network
    [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$   ]]
    
        ||    {  echo   "please  input   a  legal   IP";exit 1 ;}
    #||是不能写在开头的
    
    
    
    for i  in  {1..6};do
        {
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up  |  tee   -a   /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi  }&
    done
    wait
    
    [root@centos73 shell_scripts]# bash  scan_ip.sh 
    please   input   the   network(eg:192.168.137.0):1
    please  input   a  legal   IP
    [root@centos73 shell_scripts]# bash  scan_ip.sh   
    please   input   the   network(eg:192.168.137.0):1.1.1.1
    192.168.137.1 is up
    192.168.137.5 is down
    192.168.137.3 is down
    192.168.137.6 is down
    192.168.137.2 is down
    192.168.137.4 is down
    [root@centos73 shell_scripts]# cat  /app/ip.log 
    192.168.137.1 is up
    [root@centos73 shell_scripts]# cat  scan_ip.sh 
    #!/bin/bash
    #Author=wang
    
    > /app/ip.log
    net=192.168.137
    read  -p      "please   input   the   network(eg:192.168.137.0):" network
    [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
    
     ]]   ||    {  echo   "please  input   a  legal   IP";exit 1 ;}
    
    
    
    
    for i  in  {1..6};do
        {
        if  ping  -c1  -w1   $net.$i     &>  /dev/null;then  
            echo  $net.$i  is up  |  tee   -a   /app/ip.log 
        else
    
             echo  $net.$i  is   down
        fi  }&
    done
    wait
    
    #如果ping通了就显示其为开机的,并且放到文件里面去。
    #如果ping不通就执行下一次循环。
    
    #地址输入了之后要判断是否是一个地址,使用正则表达式

     只要前3段

    [root@centos73 shell_scripts]# bash  scan_ip.sh    
    please   input   the   network(eg:192.168.137.0):192.168.137.4   
    192.168.137.1 is up
    192.168.137.5 is down
    192.168.137.3 is down
    192.168.137.6 is down
    192.168.137.2 is down
    192.168.137.4 is down
    [root@centos73 shell_scripts]# bash  scan_ip.sh    
    please   input   the   network(eg:192.168.137.0):3
    please  input   a  legal   IP
    [root@centos73 shell_scripts]# bash  scan_ip.sh    
    please   input   the   network(eg:192.168.137.0):1.1.1.1
    1.1.1.1 is up
    1.1.1.2 is down
    1.1.1.4 is down
    1.1.1.5 is down
    1.1.1.3 is down
    1.1.1.6 is down
    [root@centos73 shell_scripts]# cat  /app/ip.log 
    1.1.1.1 is up
    [root@centos73 shell_scripts]# ping  1.1.1.1
    PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
    64 bytes from 1.1.1.1: icmp_seq=1 ttl=128 time=11.2 ms
    64 bytes from 1.1.1.1: icmp_seq=2 ttl=128 time=9.84 ms
    64 bytes from 1.1.1.1: icmp_seq=3 ttl=128 time=12.7 ms
    64 bytes from 1.1.1.1: icmp_seq=4 ttl=128 time=11.2 ms
    64 bytes from 1.1.1.1: icmp_seq=5 ttl=128 time=10.0 ms
    64 bytes from 1.1.1.1: icmp_seq=6 ttl=128 time=10.8 ms
    64 bytes from 1.1.1.1: icmp_seq=7 ttl=128 time=11.5 ms
    64 bytes from 1.1.1.1: icmp_seq=8 ttl=128 time=9.92 ms
    ^C
    --- 1.1.1.1 ping statistics ---
    8 packets transmitted, 8 received, 0% packet loss, time 7015ms
    rtt min/avg/max/mdev = 9.847/10.923/12.709/0.912 ms
    
    [root@centos73 shell_scripts]# cat  scan_ip.sh    
    #!/bin/bash
    #Author=wang
    
    > /app/ip.log
    net=192.168.137
    #这行是可以不要的,但是因为后面的变量会覆盖的,所以保留也不影响的。
    read -p "please input the network(eg:192.168.137.0):" network [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "please input a legal IP";exit 1 ;} net=`echo $network | cut -d. -f1-3` for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up | tee -a /app/ip.log else echo $net.$i is down fi }& done wait #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。 #地址输入了之后要判断是否是一个地址


    作者:wang618
    出处:https://www.cnblogs.com/wang618/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    Asp.NET 4.0 ajax实例DataView 模板编程1
    ASP.NET 4.0 Ajax 实例DataView模板编程 DEMO 下载
    部分东北话、北京话
    .NET 培训课程解析(一)
    ASP.NET 4.0 Ajax 实例DataView模板编程2
    ASP.NET Web Game 架构设计1服务器基本结构
    ASP.NET Web Game 构架设计2数据库设计
    TFS2008 基本安装
    Linux上Oracle 11g安装步骤图解
    plsql developer远程连接oracle数据库
  • 原文地址:https://www.cnblogs.com/wang618/p/11109287.html
Copyright © 2011-2022 走看看