zoukankan      html  css  js  c++  java
  • shell脚本编程之for语句、if语句使用介绍


    介绍了shell脚本编程之for语句、if语句的使用方法。

    上部:

    面向过程:
    顺序执行
    选择执行: if, case
    循环执行: for, while, until

    一、for语句

      格式:
         for 变量 in 列表;do
            语句1;
            语句2;
            ...
         done 
       例1、写一个脚本,添加10个用户,并让每个用户的密码同用户名】

    复制代码代码如下:

           #!/bin/bash
           for I in {1..10}; do
              useradd user$I;
           echo user$I | passwd --stdin user$I
           done

      例2、写一个脚本,分别显示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三个文件的时间戳,并将这三个文件被修改的时间改为201003030303.03

    复制代码代码如下:

            #!/bin/bash
            for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do

               stat $Dir
               touch -m -t 201003030303.03 $Dir
               stat $Dir
            done

    bash的变量类型:
        本地变量
        局部变量
        环境变量
        位置变量 :$1、$2、$3、$4....
        特殊变量:
            $?: 用于保存刚刚执行的命令的状态返回值;
    0:成功执行;1-255:失败,1,2,127
    可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返 
    回值取决于脚本执行结束前最后执行的那个语句的状态;

           $@, $*: 所有位置参数;
           $#: 位置参数的个数;
           $0: 脚本名称

    二、if语句

    1、单分支if语句:
          格式:
              if 条件; then
    语句1
    语句2
      ...
               fi
         例3、写一个脚本,实现如下功能: 如果用户存在,就说明其存在;

    复制代码代码如下:

    #!/bin/bash
       UserName=user1
     if grep "^$UserName>" /etc/passwd &> /dev/null; then
        echo "$UserName exists."
     fi

        例4、写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点;
    复制代码代码如下:

    #!/bin/bash
    Device='/dev/sda3'
    if mount | grep "^$Device" &> /dev/null; then
       mount | grep "/dev/sda3" | cut -d' ' -f3
    fi

    例5、写一个脚本,实现如下功能: 如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;

    复制代码代码如下:

        #!/bin/bash
         File='/etc/rc.d/rc.sysinit'
        if grep "^$" $File &> /dev/null; then
         grep "^$" $File | wc -l
        fi

    2、双分支if语句:

      格式:
       if 条件; then
     语句1
     语句2
     ...
    else
     语句1
     语句2
     ...
    fi

       例6、写一个脚本,实现如下功能:

         如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在;

    复制代码代码如下:

            #!/bin/bash
              Device='/dev/sda3'
            if mount | grep "^$Device" &> /dev/null; then

               mount | grep "/dev/sda3" | cut -d' ' -f3
            else
              echo "$Device not mounted or not exist."
            fi

    3、多分支if语句:
        格式:
        if 条件1; then
     语句1
     语句2
     ...
    elif 条件2; then
     语句1
     语句2
     ...
    elif 条件3; then
     语句1
     语句2
     ...
    else
     语句1
     语句2
     ...
    fi
       例7、写一个脚本:
          判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
          如果其生产商为GenuineIntel,就显示其为Intel公司;
          如果其生产商为AuthenticAMD,就显示其为AMD公司;
         否则,就显示无法识别;

    复制代码代码如下:

        #!/bin/bash
           Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
           if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then

             echo "intel"
           elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then
             echo "AMD"
           else
             echo "Unknown"
           fi

    下部:

    一、bash条件测试:
         整数测试   [ expression ]
         字符测试     [[ expression ]]
         条件测试     test expression   test 根据表达式求值的结果返回 0(真)或 1(假)

    1、整数测试:数值比较
             -gt   大于
             -ge   大于或等于
             -eq   等于
             -lt   小于
             -le   小于或等于
             -ne    不等于

    例1:写一个脚本,生成两个随机数,比较其大小;显示大数;

    bash有个内置变量:$RANDOM

    复制代码代码如下:
    #!/bin/bash 
    #edit by www.jbxue.com
       A=$RANDOM 
      B=$RANDOM 
    if [ $A -ge $B ]; then
      echo "Max number is $A."
    else
      echo "Max number is $B."
    fi

    例2:写一脚本,随机生成一个整数,判定,显示其奇偶性;

    复制代码代码如下:

    #!/bin/bash 

    A=$RANDOM 
    if [ $[$A%2] -eq 0 ]; then
      echo "$A: Even"
    else
      echo "$A: Odd"
    fi

    例3、写一个脚本:

    计算100以内所有奇数的和以及所有偶数的和;分别显示之;

    复制代码代码如下:
    #!/bin/bash 
    #edit by www.jbxue.com
    EvenSum=0 
    OddSum=0 
    for I in {1..100}; do
      if [ $[$I%2] -eq 0 ]; then
        EvenSum=$[$EvenSum+$I] 
      else
        OddSum=$[$OddSum+$I] 
      fi
    done
    echo "EvenSum is: $EvenSum. OddSum is: $OddSum."

    例4、计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;

    复制代码代码如下:

    #!/bin/bash 
    EvenSum=0 
    OddSum=0 
    for I in `seq 1 $1`;do
      if [ $[$I%2] -eq 1 ]; then
        OddSum=$[$OddSum+$I] 
      else
        EvenSum=$[$EvenSum+$I] 
      fi
    done
    echo "EvenSum: $EvenSum."
    echo "OddSUm: $OddSum."
    echo "Sum: $[$EvenSum+$OddSum]"

    例5、写一个脚本,完成以下要求:

         1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加;
         2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
         3、最后显示当前系统上共有多少个用户;

    复制代码代码如下:

    #!/bin/bash 
    Count=0 
    for I in {1..10}; do
      if id user$I &> /dev/null; then
        echo "user$I exists."
      else
        useradd user$I 
        echo "Add user$I successfully."
        Count=$[$Count+1] 
      fi
    done
    echo "Add $Count new users."
    echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."

    2、bash字符测试:
           >: 大于
           <: 小于
          ==: 等于
          =~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
             [[ $opt1 =~ $opt2 ]]一般做行首、行尾锚定;不要加引号
     单目:
         -z $STRING: 为空则为真,不空则为假;
         -n $STRING: 为空则为假,不空则真;

    例6、写一个脚本,判定用户的shell是否为bash;

    复制代码代码如下:
    #!/bin/bash 
    #edit by www.jbxue.com
    Shell=`grep "^$1:" /etc/passwd | cut -d: -f7` 
    if [ "$Shell" == "/bin/bash" ]; then
      echo "Bash User."
      Ret=0 
    else
      echo "Not Bash User."
      Ret=9 
    fi
    exit $Ret

    例7、根据用户shell的结束符是否为sh来判定其是否为登录用户:

    复制代码代码如下:

    #!/bin/bash 
    Shell=`grep "^$1:" /etc/passwd | cut -d: -f7` 
    if [ -z $Shell ]; then
      echo "No shell."
      exit 3 
    fi
    if [[ "$Shell" =~ sh$ ]]; then
      echo "Login User."
      Ret=0 
    else
      echo "None Login User."
      Ret=4 
    fi
    exit $Ret 

    二、bash测试之文件测试:

        操作符 文件路径
           -f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
           -d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
           -e: 测试文件是否存在;存在为真,否则为假;
           -r: 测试文件对当前用户来说是否可读; 
           -w: 测试文件对当前用户来说是否可写;
           -x: 测试文件对当前用户来说是否可执行;
           -s: 测试文件大小是否不空,不空则真,空则假;
    短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
     与运算:
       真 && 真 =  真
       真 && 假 =  假
       假 && {真|假} = 假


     或运算:
       假 || 0 = 0
       假 || 1 = 1
       真 ||   =1

    例8、给定一个路径,判断如果为普通文件,显示之;如果为目录,显示之;
          否则,说无法识别;

    复制代码代码如下:

    #!/bin/bash 
    if [ ! -e $1 ]; then
      echo "No such file."
      exit 7 
    fi
    if [ -f $1 ]; then
      echo "Common file."
    elif [ -d $1 ]; then
      echo "Directory."
    else
      echo "Unknown file."
    fi

    综合例子:
    写一个脚本:可以接受一个参数,其使用形式如下:
    script.sh {start|stop|restart|status}
    如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;
    如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;
    如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;
    如果参数为status,那么:
    如果/var/lock/subsys/script文件存在,则显示为“script is running.”
    否则,则显示为“script is stopped.”
    其它任何参数:则显示“script.sh {start|stop|restart|status}”

    复制代码代码如下:
    #!/bin/bash 
    #edit by www.jbxue.com
     if [ $1 == start ] ;then
       touch /var/lock/subsys/script
       echo "Starting script successfully."
     elif [ $1 == stop ] ; then
        rm -f /var/louk/subsys/script
        echo "Stop script finished."
     elif [ $1 == restart ];then
         rm -f /var/louk/subsys/script
         touch  /var/lock/subsys/script
        echo "Restarting script successfully."
      elif [ $1 == status ];then
         [ -e /var/lock/subsys/script ]&& echo "script is running." || echo "script is stopped."
     else
       echo "script.sh {start|stop|restart|status}"
    fi
  • 相关阅读:
    JPA唯一索引更新删除的问题
    java8时间类的一些封装
    windows 下面必备软件
    YAPI工具在SpringMVC下的使用需要注意的一些问题
    软件
    sublime常用快捷键
    nio学习
    springboot集成rabbitmq的一些坑
    maven子项目的springboot配置
    RabbitMQ 学习
  • 原文地址:https://www.cnblogs.com/linuxnotes/p/3334193.html
Copyright © 2011-2022 走看看