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原本的环境

posted @ 2018-05-09 08:54  不懂123  阅读(979)  评论(0编辑  收藏  举报