zoukankan      html  css  js  c++  java
  • Linux学习笔记(八)——简单shell语法

                    编写Shell脚本的简单语法

      提到编程,条件、分支、循环等语法肯定少不了。shell脚本编程亦是如此,下面只是结合最近学习的一些简单语法做的笔记,如有错误,欢迎指正。

      if条件语句

      条件测试操作

        test命令:

          用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其它值

          格式:test  条件表达式   或者

             [  条件表达式  ](注意:方括号[]和条件表达式语句之间至少需要一个空格)

      常见的测试类型:测试文件状态;字符串比较;整数值比较;逻辑测试

    测试文件状态:[  操作符   文件或目录  ]

    常用的测试操作符
    -d:测试是否为目录(Directory)
    -e:测试目录或文件是否存在(Exist)
    -f:测试是否为文件(File)
    -r:测试当前用户是否有权限读取(Read)
    -w:测试当前用户是否有权限写入(Write)
    -x:测试当前用户是否可执行(Excute)该文件
    -L:测试是否为符号连接(Link)文件
    如何判断当前所在的工作目录是否为 /usr/src?
    [ $PWD = “/usr/src” ] && echo “YES” || echo “NO”
    [root@localhost ~]# [  -d /etc/vsftpd  ]
    [root@localhost ~]# echo $?
    0   ==>返回值为0,表示上一步测试的条件成立
    [root@localhost ~]# [  -d /etc/hosts  ]
    [root@localhost ~]# echo $?
    1
    [root@localhost ~]# [ -e /media/cdrom ] && echo "YES"   ==>如果测试的条件成立则输出“YES”
    YES 
    [root@localhost ~]# [ -e /media/cdrom/Server ] && echo "YES“
    [root@localhost ~]#

        上述&&是“与”的意思,“… && echo YES”表示如果没有输出,则表示前面执行的测试条件不成立或命令出错。备注:l测试文件是否可写(-w)时,不要以root用户(特权用户)的身份执行测试,否则可能会无法准确判断)

    整数值比较:[  整数1  操作符  整数2  ]

    常用的测试操作符
    -eq:等于(Equal)
    -ne:不等于(Not Equal)
    -gt:大于(Greater Than)
    -lt:小于(Lesser Than)
    -le:小于或等于(Lesser or Equal)
    -ge:大于或等于(Greater or Equal)
    [root@localhost ~]# who | wc -l
    5
    [root@localhost ~]# [ `who | wc -l` -le 10 ] && echo "YES"  ==>如果登录用户数小于或等于10则输出YES
    YES 
    [root@localhost ~]# df -hT | grep "/boot" | awk '{print $6}'
    12% 
    [root@localhost ~]# BootUsage=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f 1`
    解释: df -hT                查看所有分区的磁盘空间使用情况
    grep “/boot”          过滤出关于/boot分的数据行
    awk ‘{print $6}’      以空格为分隔符,只取第六个字段数据
    cut -d “%” -f1        以%为分隔符,只取第一个字段数据
    [root@localhost ~]# echo $BootUsage
    12
    [root@localhost ~]# [ $BootUsage -gt 95 ] && echo "YES"  ==>如果/boot分区的磁盘使用率超过95%则输出YES

    条件测试操作:[  字符串1 =  字符串2  ]

    常用的测试操作符
    =:字符串内容相同
    !=:字符串内容不同,! 号表示相反的意思
    -z:字符串内容为空
    [root@localhost ~]# read -p "Location:" FilePath
    Location:/etc/inittab
    [root@localhost ~]# [ $FilePath = "/etc/inittab" ] && echo "YES" ==>如果键入路径与指定的目录一致则输出YES
    YES 
    [root@localhost ~]# [ $LANG != "en.US" ] && echo $LANG  ==>如果当前的语言环境不是en_US,则输出LANG变量的值
    zh_CN.UTF-8 

    (字符串比较可以用于检查用户输入,例如在提供交互式操作时,判断用户输入的选择项是否与指定的变量内容相匹配)

    逻辑测试:[  表达式1  ]  操作符  [  表达式2  ]

         常用的测试操作符
    -a或&&:逻辑与,“而且”的意思前后两个表达式都成立时整个测试结果才为真,否则为假)
    -o或||:逻辑或,“或者”的意思操作符两边至少一个为真时,结果为真,否则结果为假)
    !:逻辑否 当指定的条件不成立时,返回结果为真)
    [root@localhost ~]# echo $USER
    root
    [root@localhost ~]# [ $USER != "teacher" ]  &&  echo "Not teacher" ==>如果发现用户不是teacher,则提示“Not teacher”
    Not teacher
    [root@localhost ~]# [ $USER = "teacher" ]  ||  echo "Not teacher"
    Not teacher  
    逻辑测试指的是:同时使用两个(或多个)条件表达式时,判断它们之间的关系

      if语句结构——当“条件成立”时执行相应的操作

          单分支:

    if  条件测试命令 

        then   命令序列

    fi                                       

      if语句简单应用示例

    #!/bin/bash
    temp=2
    if [  $temp -eq 2  ]
    then 
        echo 'temp is 2'
    fi

       保存为test文件,并将它设置为可执行(+x)

    [jzhou@localhost ~]# chmod 775 test
    [jzhou@localhost ~]# bash test
    temp is 2

         (备注:lthen可以写到与if一行,但要用分号隔开,例如: if  [  $RATE  -gt  80  ]  ;  then)

      单分支:

    if  条件测试命令 

        then   命令序列1 

        else   命令序列2

    fi

    判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务
    #!/bin/bash
    service mysqld status &> /dev/null 
    if  [  $?  -eq  0  ]   ==>判断上句是否执行成功
        then
            echo  "mysqld service is running."
        else
            /etc/init.d/mysqld  restart
    fi
    提示用户输入一个整数,如何判断该值是否小于100?
    read  “Input an integer:” NUM ; 
               if  [ $NUM  -lt  100 ] ; then
                   echo “小于100”
               else
                  echo  “大于或等于100”
               fi

      多分支: 

    if  条件测试命令1  ;  then

        命令序列1

    elif  条件测试命令2  ;  then

        命令序列2

    elif  ...

    else

        命令序列n

    fi

      for循环语句——根据变量的不同取值,重复执行一组命令操作

       for语句的结构

    for  变量名  in  取值列表

    do

         命令序列

    done

       for语句简单应用示例

    依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串
    [root@localhost ~]# vi showday.sh
    #!/bin/bash
    for TM in "Morning" "Noon" "Evening"
    do
        echo "The $TM of the day."
    done 
    [root@localhost ~]# sh showday.sh
    The Morning of the day.
    The Noon of the day.
    The Evening of the day 
     示例2:获得用户的满足条件的文件数
    #!/bin/bash DIR="/opt" LMT=100 ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1` ==>获得使用bash作为登录shell的用户名列表 for UserName in $ValidUsers do Num=`find $DIR -user $UserName | wc -l` if [ $Num -gt $LMT ] ; then echo "$UserName have $Num files." fi done
    [root@localhost ~]# sh chkfileown.sh
    root have 6737 files.
    teacher have 344 files. 

      while循环语句——重复测试指定的条件,只要条件成立则反复执行对应的命令操作

      while语句的结构

     while  命令或表达式 

     do 

          命令列表

     done

      while语句简单应用示例

    批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
    #!/bin/bash
    i=1
    while  [  $i  -le  20  ]
    do
        useradd stu$i
        echo "123456" | passwd --stdin stu$i &> /dev/null
        i=`expr $i + 1`
    done 
    批量删除上述添加的20个系统用户帐号
    #!/bin/bash
    i=1
    while  [  $i  -le  20  ]
    do
        userdel -r stu$i
        i=`expr $i + 1`
    done 

      分支控制语句

      case语句——根据变量的不同取值,分别执行不同的命令操作

    case  变量值  in

        模式1)

               命令序列1

               ;;

        模式2)

              命令序列2

               ;;

      ……

        * )

              默认执行的命令序列

    esac

    (当遇到双分号“;;”后跳转至esac表示结束分支。如果一直找不到相匹配的值,则执行最后一个模式“*)”后的默认命令序列,直到遇到esac后结束分支)

    #!/bin/bash 
    case   $1   in
        start)
            echo  "Start MySQL service."
            ;;
        stop)
            echo  "Stop MySQL service."
            ;;
        *)
            echo  "Usage:$0  start|stop"
            ;;
    esac

    (/etc/init.d/ 目录下的各类脚本中,大量使用了case分支语句结构)

    #!/bin/bash
    read  -p  "Press some key, then press Return:“  KEY
    case  "$KEY“  in
      [a-z]|[A-Z])
          echo "It's a letter."
          ;;
      [0-9])
          echo "It's a digit."
          ;;
      *)
          echo "It's function keys、Spacebar or other keys. "
    esac

    匹配模式中可以使用方括号表示一个连续的范围,例如“[0-9]”;使用竖杠符号“|”表示或,例如“A|B”A或者B

      unitl语句——根据条件执行重复操作

    until  条件测试命令

    do

          命令序列

    done

    (•until 循环的结构与while命令类似,“until通过检测其后接命令的返回值“$?”来判断是否退出循环

       •until:直到”测试条件“成立时终止循环,而while是:当”测试条件“成立时进行循环

       •即:until在测试条件为假(非0)时执行循环,条件为真时(0)退出循环,正好与while循环相反)

      shift语句——用于迁移位置变量,将 $1~$9 依次向左传递(不常用)

    例如,若当前脚本程序获得的位置变量如下:
     $1=file1、$2=file2、$3=file3、$4=file4
    则执行一次shift命令后,各位置变量为:
     $1=file2、$2=file3、$3=file4
    再次执行shift命令后,各位置变量为:
     $1=file3、$2=file4
    通过命令行参数传递多个整数值,并计算总和
    [root@localhost ~]# vi showday.sh
    #!/bin/bash
    Result=0
    while  [  $#  -gt  0  ]  ==> $# 为预定义变量,表示位置参数的个数
    do
        Result=`expr $Result + $1`
        shift
    done
    echo "The sum is : $Result"
    [root@localhost ~]# ./sumer.sh  12  34  56
    The sum is : 102 

      循环控制语句

        break:在for、while、until等循环语句和case中用于跳出当前的循环体,执行循环体后的语句;并不退出程序。执行break命令后将跳到done语句之后。

     

        continue:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环

      shell函数应用

      定义新的函数:

       

      调用已定义的函数: 函数名

      向函数内传递参数:函数名   参数1   参数2 ......

    #!/bin/bash
    adder() {
        echo `expr $1 + $2`
    }
    adder 12 34
    adder 56 789
    [root@localhost ~]# sh adderfun.sh
    46
    845 

    (在脚本内部,已经定义的函数就好比“内部命令”一样,可作为执行语句直接使用)

  • 相关阅读:
    【UOJ#77】A+B Problem
    【AGC048B】Bracket Score
    ubuntu 下python opengl编程(2)
    网站建设的营销途径
    python脚本初探---新手写的QQ邮箱发送脚本
    Cstyle的C语言笔记 ---UEFI当中的面向对象模式
    date得到当前日期
    简单几步让SecureCRT更舒服【图文并茂】
    苹果的airplayer推荐
    【Cocos2d-X开发学习笔记】第22期:事件处理机制之触屏事件
  • 原文地址:https://www.cnblogs.com/zhoujie/p/linux8.html
Copyright © 2011-2022 走看看