shell脚本之条件测试

组合条件测试:在多个条件间实现逻辑运算

    与:[ condition1 -a condition2 ]、condition1 && condition2
    或:[ condition1 -o condition2 ]、condition1 || condition2
    非:[ -not condition ]、[ ! condition ]

1.整型测试(整数比较)

运算符                    描述              示例    
num1 -gt num2             大于              [ $num -gt 100 ]    
num1 -lt num2             小于              [ $num -lt 100 ]   
num1 -ge num2             大于等于          [ $num -ge 100 ]    
num1 -le num2             小于等于          [ $num -le 100 ]    
num1 -eq num2             等于              [ $num -eq 100 ]    
num1 -ne num2             不等于            [ $num -ne 100 ]

2.字符测试(字符串比较)

运算符                描述                                示例    
                                                          test  "${String1}" \> "${String2}" 
String1 > String2     如果字String1大于String2,则为真    [ "${String1}" \> "${String2}" ]
                                                          [[ "${String1}" > "${String2}" ]]   
                                                           
                                                          test  "${String1}" \< "${String2}" 
String1 < String2     如果字String1小于String2,则为真    [ "${String1}" \< "${String2}" ]
                                                          [[ "${String1}" < "${String2}" ]]
                                                          
                                                          test  "${String1}" =="${String2}"   
String1 == String2    如果字String1等于String2,则为真    [ "${String1}" =="${String2}" ]
                                                          [[ "${String1}" =="${String2}" ]]
                                                          
                                                          test  "${String1}" !="${String2}" 
String1 != String2    如果字String1不等于String2,则为真  [ "${String1}" !="${String2}" ]
                                                          [[ "${String1}" !="${String2}" ]]
       
-n String             如果String长度为零,则为真          [ -n "${myvar}"]    
-z String             如果String长度为非零,则为真        [ -z "${myvar}" ] 
   
注意:
字符串必须用单引号或双引号引起来,有变量必须用双引号。
test与[]是shell命令,所以字符串比较操作符“<"、">"必须转义。

3.文件测试(判断文件是否存在及其属性)

参数  描述                                   示例
    
-e    文档存在则为真,同-a                   [[ -e /tmp ]]   
-f    文档存在且为普通文件则为真             [[ -f /etc/passwd ]]  
-d    文档存在且为目录则为真                 [[ -d /tmp ]]    
-L    文档存在且为符号链接为件则为真,同h    [[ -L /dev/stdin ]]    
-b    文档存在且为块设备则为真               [[ -b /dev/xvda ]]    
-c    文档存在且为字符设备则为真             [[ -c /dev/zero ]]    
-S    文档存在且为套接字文件则为真           [[ -S /dev/log ]]   
-p    文档存在且为命令管道则为真             [[ -p /var/run/autofs.fifo-net ]]   
-s    文档存在且为非空文件则为真             [[ -s /etc/passwd ]]   
 
-r    文档存在且具有可读权限则为真           [[ -r /etc/passwd ]]   
-w    文档存在且具有可写权限则为真           [[ -w /etc/passwd ]]    
-x    文档存在且具有可执行权限则为真         [[ -x /etc/init.d/dhcpd ]]    
-u    文档存在且具有SUID属性则为真           [[ -u a.txt ]]    
-g    文档存在且具有SGID属性则为真           [[ -g a.txt ]]
    
-nt    file1的mtime新于file2则为真           [[ a.txt -nt b.txt ]]    
-ot    file1的mtime旧于file2则为真           [[ a.txt -ot b.txt ]]

综合示例:

例1:如果当前主机名为空或者为“localhost”,则将其修改为chenss

   #!/bin/bash
   #
   host_name=$(hostname)
   [ -z "${host_name}" -o "${host_name}" == "localhost" ] && hostname chenss

例2:执行脚本,提示输入用户名,如果无此用户,则报错且继续提示输入用户名;如果UID等于0,则提示是root用户;如果大于0小于500,则提示是系统用户;否则,提示是普通用户。

  #!/bin/bash
  #
  until  [ "${user_name}" == "q" -o "${user_name}" == "quit" ] ; do
  
  read -p "PLS enter a username: " user_name
  user_id=$(id -u ${user_name})
  
  if ! id -u ${user_name} &> /dev/null; then
       continue
  elif [[ ${user_id} -eq 0 ]] ; then
       echo "It's a root user."
  elif [ ${user_id} -gt 0 -a ${user_id} -lt 500 ]; then
       echo "It's a system user."
  else
       echo "It's a common user."
  fi
  done

例3:添加10个用户,如果用户存在,则显示有此用户并把用户名标红,如果不存在,则添加并把用户名背景色标绿,且显示一共添加了多少用户。

  #!/bin/bash
  #
  declare -i num=0
  for i in {1..10}; do
       if id -u test$i &> /dev/null; then
             echo -e "user 33[0;31;1mtest$i33[0m is exists."
       else
             useradd test$i && echo -e "33[0;42;1mtest$i33[0m add succesfully."
             let num++
       fi
  done
  echo "Total add $num users."

原创文章,作者:老鼠上了猫,如若转载,请注明出处:http://www.178linux.com/7166

(1)
老鼠上了猫老鼠上了猫
上一篇 2015-08-24 18:27
下一篇 2015-08-24 21:28

相关推荐

  • 第一周作业

    – 描述计算机的组成及其功能。 – 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。 – 描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。 – 说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、history、shu…

    Linux干货 2016-12-04
  • rpm实现LAMP

    rpm实现LAMP部署 LAMP概述 LAMP指的Linux(操作系统)、ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母,一般用来建立web应用平台。常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同…

    Linux干货 2016-11-02
  • 马哥linux第一周学习笔记

    计算机组成 Linux基本命令

    Linux干货 2017-12-17
  • N22-第一周练习作业-冥界之王

    1.描述计算机系统的组成及功能硬件组成(输入设备,输出设备,存储器,运算器,控制器) 输入设备:鼠标,键盘,麦克,声卡(输入声音),扫描仪,手写板等输出设备:显示器,声卡(输出声音),音箱,投影仪等存储器:内存,硬盘,磁带,CPU内部还可以分1,2,3级缓存运算器:主要完成对二进制数据的定点算术运算(加减乘除)、逻辑运算(与或非异或)以及移位操作。在某些CP…

    Linux干货 2016-08-15
  • 魔术方法

    Edit 魔术方法 使用Python的魔术方法的最大优势在于他们提供了一种简单的方法来让对象可以表现的像内置类型一样。那意味着你可以避免丑陋的,违反直觉的,不标准的的操作方法。 特殊属性 属性 含义 __name__ 类、函数、方法等名字 __module__ 类定义所在的模块名? __class__ 对象或类所属的类 __bases__ 类的基类的元组,顺…

    Linux干货 2017-11-21
  • 脚本编写规范

    脚本编写规范 脚本名称以.sh结尾,名称见名知意 尽量使用UTF-8编码,注释及输出尽量使用英文 一般给到执行权限,但一些关于变量的配置文件不用加执行权限 执行的时候可以使用bash执行,或者使用bash -x 调试执行 脚本首行以#!/bin/bash,无空格,不带选项 第二行为空格或者添加一行空注释 开始注释内容:  #!/bin/bash&n…

    Linux干货 2017-04-16