zoukankan      html  css  js  c++  java
  • shell脚本循环和信号

    条件判断

        if     条件1;then

             COMMAND

       elif  条件2;then

            COMMAND

       else

           COMMAND(:)        :  表示pass  不执行任何命令

        fi 

        读取用户输入在进行数据判断

    1   echo -n "输入你的数字: "
    2   read userinput
    3   expr $userinput+ 0 &>/dev/null
    4   if [ $? -ne 0 ]; then
    5     echo "必须输入数字!"
    6     continue
    7   else
    8     COMMAND
    9   fi
    View Code

        case 变量引用 in

        PAT1)

            分支1

        ;;

       esac

       变量名和变量引用的区别:  变量引用就是需要在变量名前面添加一个$,       name表示变量名     $name表示变量引用

       并行执行shell命令  wait的作用是表示后台命令执行完毕后退出程序,默认后台程序结束后需要手动敲回车键才能退出程序

       

    1 net=172.17.51
    2 for i in {1..254};do
    3    { if ping -c1 -w1 $net.$i &> /dev/null ;then
    4           echo $net.$i is up
    5     else
    6           echo $net.$i is down
    7     fi; } &
    8 done
    9 wait
    View Code

    循环

       for循环

         for((  exp1; exp2; exp3  )); do COMMANDS; done

         exp1 是循环的初始化语句 实际上不参与循环

         exp3 相当于循环体中的最后一条语句

         exp2 为循环条件的判断语句     每次执行循环体之前都必须先判断exp2的执行结果

        

     1 #!/bin/bash
     2 declare -a array
     3 for((i=1;i<=10;i++))
     4 do
     5    array[$i]=$((RANDOM%100))
     6 done
     7 
     8 MIN=${array[1]}
     9 MAX=${array[1]}
    10 
    11 for num in ${!array[@]};do
    12    echo $((array[${num}]))
    13    if [[ ${MIN} -ge ${array[${num}]} ]];then
    14       MIN=${array[${num}]}
    15    fi
    16    if [[ ${MAX} -le ${array[${num}]} ]];then
    17       MAX=${array[${num}]}
    18    fi
    19 
    20 done
    21 echo "the min is $MIN"
    22 echo "the max is $MAX"
    View Code
     1 #!/bin/bash
     2 declare -i min max
     3 declare -a nums
     4 for((i=0;i<10;i++));do
     5  nums[$i]=$RANDOM
     6  [ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]} && continue
     7  [ ${nums[$i]} -gt $max ] && max=${nums[$i]}
     8  [ ${nums[$i]} -lt $min ] && min=${nums[$i]}
     9 done
    10 echo "all numbers are ${nums[*]}"
    11 echo Max is $max
    12 echo Min is $min
    View Code
    1 #!/bin/bash
    2 re=`wc -l $1 | cut -d " " -f1`
    3 echo $re
    View Code
      continue和break

         continue 和 break 后面可以添加一个数字N,表示提前结束第N层的本轮循环从而直接进入下一轮的判断,最内层的循环为第1层

         continue 2   or   break 3

      循环控制shift命令

          将参数列表向左移动,默认移动单位为1,移动后的参数会自动被删除.使用的场景:配合循环遍历逐个处理提供给执行脚本的位置参数

     while循环的特殊用法

        循环遍历文件或者命令的标准输出

    1  df | while read line;do
    2          echo $line
    3   done;
    4 
    5  while read line;do
    6         echo $line
    7  done < /root/file
    View Code
    select循环与菜单

         select  variable  in  list

              do

                    循环体命令

              done

         select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在 标准错误上,并显示 PS3 提示符,等待用户输入 

         用户输入菜单列表中的某个数字,执行相应的命令 

         用户输入被保存在内置变量 REPLY 中

    信号捕捉trap

          trap      '触发指令'     信号      自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作 

          trap  ''      信号       忽略信号的操作

          trap  '-'     信号       恢复原信号的操作 

          使用 kill -l  查看所有能捕捉的信号数据

          trap  "echo press ctrl+c"  2

          kill -9 的信号无法被捕捉到

    [root@iz2ze6e5pr6sbu9qxhzulaz ~]# kill -l
     1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
     6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
    11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
    16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
    21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
    26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
    31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
    38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
    43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
    48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
    53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
    58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
    63) SIGRTMAX-1    64) SIGRTMAX    
    View Code

    父 shell 子 shell  export 与 变量传递

       一般而言,在一个脚本里执行一个外部命令(普通的可执行文件)时,shell 会 fork 出一个子进程,然后再用 exec 来执行这个程序;但是,bash shell 的内置命令(builtin)却不会这样,它们是直接执行的。所以,等价的内置命令的执行速度会比执行外部命令要来的快

       子 shell 对父 shell 里 export 出来的变量进行修改并不能影响到父 shell。这说明了,子 shell 只是在“导出变量列表“里对该变量进行了一个拷贝

       子shell中export 出来的变量不能导出到父进程或者是父进程的环境里。一个自己称可以继承父进程的东西,而不能反过来去影响父进程

    父子shell中的变量交换本质上是利用进程之间的通信方式来实现的

     1 #!/bin/bash
     2 rm -f tmp.txt
     3 df -h |grep '^/dev*' | while read line;do
     4    name=`echo $line | cut -d" " -f1`
     5    data=`echo $line | cut -d" " -f5`
     6    echo $name-$data >> tmp.txt
     7 done
     8 
     9 declare -A arr
    10 while read line;do
    11    key=${line%-*}
    12    value=${line#*-}
    13    arr[$key]=$value
    14 done < tmp.txt
    15 
    16 echo ${!arr[@]}
    17 echo ${arr[@]}
    18 
    19 
    20 
    21 
    22 [root@centos7 ~]# bash whiledf.sh 
    23 /dev/sda1 /dev/sda3 /dev/sda2
    24 20% 1% 9%
    View Code
    关于export

        1.一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);
        2.一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
        3.不用export定义的变量只对该shell有效,对子shell也是无效的。

    shell执行机制

        用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序.

        shell执行外部命令或运行shell脚本程序时,系统将创建一个子shell,然后在子Shell中执行此Shell脚本 

       一旦子Shell中的脚本执行完毕,此子Shell随即结束,返回到父Shell中,但不会影响父Shell原本的环境

  • 相关阅读:
    Poj_1088_滑雪(DP)
    Poj_1088_滑雪(DP)
    Poj_1011_Sticks(剪枝)
    Poj_1011_Sticks(剪枝)
    Poj_1068 Parencodings
    Poj_1068 Parencodings
    Poj_1005_I Think I Need A HouseBoat
    Poj_1005_I Think I Need A HouseBoat
    Poj_1004_FinancialManagement
    git分支管理
  • 原文地址:https://www.cnblogs.com/yxh168/p/9004821.html
Copyright © 2011-2022 走看看