zoukankan      html  css  js  c++  java
  • shell脚本编程进阶总结

           这两天学习了shell脚本编程进阶,作为一枚文科生,小编觉得...恩..脚本很烧脑.....,不过小编还是做了些题,稍作总结后,呈给各位看官,内容如下:

    一、条件选择if语句

    选择执行: 

    注意:if语句可嵌套 

    单分支

       if 判断条件;then

          条件为真的分支代码

       fi

    双分支

       if 判断条件; then

          条件为真的分支代码

       else

          条件为假的分支代码

       fi

    多分支

    if 判断条件1; then

       条件为真的分支代码

    elif 判断条件2; then

       条件为真的分支代码

    elif 判断条件3; then

       条件为真的分支代码

    else

       以上条件都为假的分支代码

    fi

    1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示 其存在,否则添加之;显示添加的用户的id号等信息

      1 #!/bin/bash
      2 read -p "please input username:" username
      3    useradd $username  &> /dev/null
      4    if [ $? -eq 0 ];then
      5         echo "add $username user" && id $username
      6    else                                                                          
      7         echo "the user already exits"                                                   
      8   fi

     

    2、编写脚本/root/bin/checkint.sh,判断用户输入的参数是 否为正整数 

      1 #!/bin/bash
      2 read -p "please input a digit:" int
      3 if [[ $int =~ (^[0-9]*[1-9][0-9]*$) ]];then
      4   echo "this digit is positive integer"
      5 else
      6   echo "this digit is not positive integer"                                      
      7 fi

    二、条件判断case语句

    语法格式:

    case 变量引用 in

    PAT1)

        分支1

        ;;

    PAT2)

        分支2

        ;;

    ...

    *)

        默认分支

        ;;

    esac

    3、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no, 并判断用户输入的是yes还是no,或是其它信息

      1 #!/bin/bash
      2 read -p "can i help you? yes or no " ans
      3 case $ans in
      4 [yY][eE][sS]|[yY])
      5          echo "ok,come on"
      6          ;;
      7 [nN][oO]|[nN])
      8          echo "no,thanks"
      9          ;;
      10 *)
      11          echo "byebye"
      12          ;;
      13 esac

    4、编写脚本/root/bin/filetype.sh,判断用户输入文件路径 ,显示其文件类型(普通,目录,链接,其它文件类型)

      1 #!/bin/bash
      2 read -p "please input file path:" path  
      3 a=`ls -l $path|grep -o "^."`    #脚本里面不能使用别名,所以用ls -l
      4 case $a in
      5 -)
      6  echo "common file"
      7  ;;
      8 d)
      9  echo "directory file"
      10  ;;
      11 l)
      12  echo "linked file"
      13  ;;
      14 *)
      15  echo "other file"
      16  ;;
      17 esac

    三、for循环

    语法格式:

    for 变量名 in 列表;do

       循环体

    done

    执行机制:

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

    for循环列表生成方式:

      (1)直接给出列表

      (2)整数列表:

          (a){start..end}

          (b)$(seq [start [step]] end)

      (3)返回列表的命令

          $(COMMAND)

      (4)使用glob,如:*.sh

      (5)变量引用;

          $@, $*

    5、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

      1 #!/bin/bash
      2 read -p "please input a positive integer:" n
      3 i=1
      4 sum=0
      5 for i in `seq 1 $n`;do
      6    if [[ $n =~ (^[0-9]*[1-9][0-9]*$) ]];then  #判断n是否为正整数
      7        let sum+=i
      8    else
      9        echo "a wrong int" && exit
      10    fi
      11        let i++                                                                   
      12 done
      13 echo "sum is $sum"

    6、计算100以内所有能被3整除的整数之和

      1 #!/bin/bash
      2 sum=0
      3 i=1
      4 for i in {1..100};do
      5     if [ $[$i%3] -eq 0 ];then
      6        let sum+=i
      7     fi
      8        let i++
      9 done
      10 echo $sum

    7、打印九九乘法表

      1 #!/bin/bash                                                                      
      2 for i in {1..9};do
      3      for j in `seq 1 $i`;do
      4      echo -n "$i*$j=$[i*j] "
      5      done
      6      echo
      7 done

    8、打印等腰三角形

      1 #!/bin/bash                                                                                                         
      2 . functions
      3 read -p "please input line:" line
      4 is_digit $line
      5 #i=*的个数 s=空格个数 l=当前行数
      6 [ $? -ne 0 ] && exit
      7 # 循环打印
      8 for l in `seq 1 $line`;do
      9          for s in `seq 1 $[$line-$l]`;do
      10                  echo -en " "
      11          done
      12            for i in `seq 1 $[2*$l-1]`;do
      13                if [ $i -eq 1 ];then
      14                  color=$[RANDOM%7+31]  #定义一个31到37的随机颜色
      15                    echo -en "e[1;${color};5m*e[0m"  #1代表高亮显示,5m代表闪烁
      16                elif [ $i -eq $[$l*2-1] ];then
      17                    echo -en "e[1;${color};5m*e[0m"
      18                else
      19                    echo -en "*"
      20                fi
      21           done
      22 echo
      23 done

    四、while循环

    语法格式:

    while CONDITION; do

        循环体

     done

    CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环

    因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

    进入条件:CONDITION为true

    退出条件:CONDITION为false

    9、编写脚本,求100以内所有正奇数之和

        1 #!/bin/bash
      2 i=1
      3 sum=0
      4 while [ $i -le 100 ];do
      5     if [ $[$i%2] -ne 0 ];then
      6        let sum+=i
      7     fi
      8        let i++
      9 done
     10 echo "sum is $sum"

    10、编写脚本,利用变量RANDOM生成10个随机数字,输出 这个10数字,并显示其中的最大值和最小值

      1 #!/bin/bash
      2 i=1
      3 a=$RANDOM
      4 max=$a
      5 min=$a
      6 while [ $i -le 10 ];do
      7       [ $max -lt $a ] && max=$a
      8       [ $min -gt $a ] && min=$a
      9 a=$RANDOM
     10     echo "$a"
     11     let i++
     12 done
     13 echo "max is $max"
     14 echo "min is $min"

    11、编写脚本,实现打印国际象棋棋盘

     1 #!/bin/bash                                                                      
      2 red="e[41m  e[0m"
      3 white="e[47m  e[0m"
      4 for i in `seq 1 8`;do    #这里定义了一个8行的棋盘
      5          if [ $[i%2] -eq 0 ];then    #判断是否为偶行
      6              for j in {1..4};do    #四个偶数行就循环四遍红白色
      7                 echo -en "$red$white"
      8              done
      9          else
     10              for j in {1..4};do    #四个奇数行循环白红行
     11               echo -en "$white$red"
     12              done
     13          fi
     14          echo
     15 done

    12、后续六个字符串:efbaf275cd、4be9c40b8b、 44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63 是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值

     1 #!/bin/bash
      2 key_num_array=(efbaf275cd 4be9c40b8b 44b2395c46 f8c8873ce0 b902c16c8b ad865d2f63)  #将这些字符串赋值到数组里,方便调用
      3 for true_num in `seq 0 65535`;do   #RANDOM值为0~65535
      4     key_num=`echo $true_num | md5sum | cut -c 1-10`
      5     for num in  ${key_num_array[*]}; do
      6         if [ "$key_num" == "$num" ];then
      7             echo "$num --> $true_num" 
      8         fi                                                                       
      9     done
     10 done

    五、Until循环(与while条件相反,比较少用)

    语法格式:

    until CONDITION; do

    循环体 

    done 

    进入条件: CONDITION 为false 

    退出条件: CONDITION 为true

    13、每隔3秒钟到系统上获取已经登录的用户的信息;如果发 现用户hacker登录,则将登录时间和主机记录于日志 /var/log/login.log中,并退出脚本

     1 #!/bin/bash                                                                      
      2 until who |grep "^hacker>";do
      3  sleep 3
      4 done
      5  who|egrep -o "^hacker.*"|sed -r 's/^hacker[[:space:]]+'// >> /app/hacker.log   #小编这里记录于这个路径
      6  echo "you should logout"| mail hacker

    14、随机生成10以内的数字,实现猜字游戏,提示比较大或小 ,相等则退出

     1 #!/bin/bash                                                                      
      2 num=$[$RANDOM%10+1]
      3 read -p "please guess:" i
      4 until [ $num -eq $i ]; do
      5    if [ $i -lt $num ]; then
      6         echo "less,guess again"
      7    else
      8         echo "bigger,guess again"
      9    fi
     10 read -p "please guess:" i
     11 done
     12 echo "guess succeed!";exit

    六、循环控制语句continue

    用于循环体中 

    continue [N]:提前结束第N层的本轮循环,而直接进入下一 轮判断;最内层为第1层

    语法格式:

    while CONDTIITON1; do

    CMD1

    ...

    if CONDITION2; then

    continue

    fi

    CMDn

    ...

    Done

     举例奇数相加并跳过51

      1 #!/bin/bash
      2 for((i=1,sum=0;i<=100;i++));do #奇数相加
      3     [ $i -eq 51 ] && continue  #结束本轮循环,就是跳过51执行下面的奇数53  
      4     [ $[i%2] -eq 1 ] && let sum+=i
      5  done 
      6  echo "sum is $sum"                                                              
      7  unset i sum

    七、循环控制语句break

    用于循环体中 

    break [N]:提前结束第N层循环,最内层为第1层

    语法格式:

    while CONDTIITON1; do

    CMD1

    ...

    if CONDITION2; then break

    fi

    CMDn

    ...

    Done

    举例结束点餐

     1 #!/bin/bash                                                                                                         
      2 cat << EOF
      3 1 yangroufan
      4 2 mifan
      5 3 hulatang
      6 4 jiaozi
      7 5 lamian
      8 6 huimian
      9 7 exit
     10 EOF
     11 while true;do
     12 read -p "please choose: " wufan
     13 case $wufan in
     14 1|4)
     15       echo "price 20"
     16       ;;
     17 2|5)
     18       echo "price 15"
     19       ;;
     20 3|6)
     21       echo "price 10"
     22       ;;
     23 7)
     24       break  #输入7就直接退出这个循环
     25       ;;
     26 *)
     27       echo "no this option"
     28       ;;
     29 esac
     30 done

    八、循环控制shift命令

    shift [n] 

    用于将参量列表 list 左移指定次数

    参量列表 list 一旦被移动,最左端的那个参数就从列表中删 除。while 循环遍历位置参量列表时,常用到 shift

    举例:

      1 #!/bin/bash                                                                                                         
      2 while (( $# > 0 ));do
      3   echo $*
      4   shift
      5 done

    九、select与case

    select 循环主要用于创建菜单,按数字顺序排列的,它是个无限循环,因此要记住用 break 命令退 出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环 

    select 经常和 case 联合使用

    举例创建菜单并退出菜单: 

      1 #!/bin/bash                                                                                                         
      2 select menu in yangroufan gaojiaofan huimian hulatang quit;do
      3 case $REPLY in
      4 1|3)
      5    echo "price is 20"
      6    ;;
      7 2|4)
      8    echo "price is 15"
      9    ;;
      10 5)
      11    break
      12    ;;
      13 *)
      14    echo "no this option"
      15    ;;
      16 esac
      17 done

    十、信号捕捉trap :捕捉到信号后自定义处理

    trap '触发指令' 信号

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

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

    trap -p 列出自定义信号操作

    举例打印数字捕捉信号

     1 #!/bin/bash                                                                                                         
      2 trap 'echo press ctrl+c' 2   #提示按了ctrl+c
      3 for((i=0;i<10;i++));do
      4   sleep 1
      5  echo $i
      6 done
      7 trap '' INT   #不提示
      8  for((i=10;i<15;i++));do
      9      sleep 1
      10     echo $i
      11    done
      12 trap '-' 2    #恢复ctrl+c的停止作用
      13    for((i=15;i<20;i++));do
      14      sleep 1
      15     echo $i
      16    done

            脚本虽难,写好了则“一劳永逸”。好了,到这里小编关于脚本这一节的分享就结束了,欢迎大家评论,多多指教哦。

  • 相关阅读:
    前端CSS部分简单整理
    前端HTML部分简单整理
    Top Android App使用的组件
    使用DialogFragment创建对话框总结
    Rails常用命令
    developer.android.com笔记
    Google Maps API v2 Demo Tutorial
    Android学习的一些问题
    Android学习过程
    Beginning Android 4 Programming Book学习
  • 原文地址:https://www.cnblogs.com/Qian-free/p/7531689.html
Copyright © 2011-2022 走看看