`
tomcat_oracle
  • 浏览: 316839 次
社区版块
存档分类
最新评论

shell编程之条件测试

阅读更多

shell编程中,当使用if语句时,总是涉及到条件的判断。下面来讨论下条件判断的各种情况。

 

1. 条件为语句

例如:当目录下有sam开头的文件时,输出hi,it's here.

1
2
3
if ls sam* &> /dev/null; then
    echo "Hi,it's here."
fi

当条件为语句时,直接跟在if后面,如果语句执行成功,返回0,表示真,然后执行语句块中的语句。

再来个例子,查看本机中是否有hive的用户,如果有,显示hive的uid和bash类型。

1
2
3
if grep "^hive" /etc/passwd; then
    grep "^hive" /etc/passwd | cut -d: -f1,3,7
fi

 

2. 条件为变量判断时

即判断某个变量是否符合某个条件的时候,判断语句有下面三种类型

[ expression ]

[[ expression ]]

test expression

根据变量类型,分为以下几种情况讨论:

(1) 整数测试

当变量为整数时,可以选择[ expression ]这种格式的语句。

expression可以写成这样:数值1 比较符号 数值2($A 比较符号 $B)

比较符号有下面这些:

大于:-gt, 例如 $A -gt $B

大于或等于:-ge

等于:-eq

小于:-lt

小于或等于:-le

不等于:-ne

还是看例子吧

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

bash有个内置变量:$RANDOM

1
2
3
4
5
6
7
8
9
#!/bin/bash
#
A=$RANDOM
B=$RANDOM
if [ $A -ge $B ]; then
  echo "Max number is $A."
else
  echo "Max number is $B."
fi

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

1
2
3
4
5
6
7
8
#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
  echo "$A: Even"
else
  echo "$A: Odd"
fi

 

(2) 字符测试

变量为字符时,进行字符测试。

bash字符测试时,从左至右逐字符比较

>: 大于

<: 小于

==: 等于 (前三者用的格式都是[ expression ])

=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[ expression ]];

[[ $opt1 =~ $opt2 ]],一般做行首、行尾锚定;不要加引号;

 

单目:

-z $STRING: 为空则为真,不空则为假;

-n $STRING: 为空则为假,不空则真;

 

例1:写一个脚本,判定用户的shell是否为bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
    echo "No such user or User's shell is null."
    exit 10
fi
if "$Shell" == "/bin/bash" ]; then
    echo "Bash User."
    Ret=0
else
    echo "Not Bash User."
    Ret=9
fi
exit $Ret

例2:通过参数传递一个字符串给脚本,如果传递的字符串为“memory”或“Memory”,就以MB为单位显示当前主机的内存信息

1
2
3
4
5
6
7
#!/bin/bash
#
if [[ $1 =~ [Mm]emory$ ]]; then
  free -m
else
  cat /proc/uptime
fi

 

(3) 文件测试

当变量为文件路径或目录路径时,判断其是否存在,是否是普通文件等都需要文件测试

操作符 文件路径

-f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;

-d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;

-e: 测试文件是否存在;存在为真,否则为假;

-r: 测试文件对当前用户来说是否可读;

-w: 测试文件对当前用户来说是否可写;

-x: 测试文件对当前用户来说是否可执行;

-s: 测试文件大小是否不空,不空则真,空则假

例1:

写一个脚本:可以接受一个参数,其使用形式如下:

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}”

 

进一步:修改start的机制为:

如果参数为start,且/var/lock/subsys/script文件不存在,则创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;

否则,显示“script is already running.”

 

进一步:修改stop的机制为:

如果参数为stop,且/var/lock/subsys/script文件存在,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;

否则,显示“script is stopped yet.”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
#
SvcName=`basename $0`
LockFile="/var/lock/subsys/$SvcName"
if [ $# -lt 1 ]; then
  echo "Usage: $SvcName {start|stop|restart|status}"
  exit 3
fi
if [ $1 == 'start' ]; then
  if [ -e $LockFile ]; then
    echo "$SvcName is running."
  else
    touch $LockFile &> /dev/null
    echo "Starting $SvcName successfully."
  fi
elif [ $1 == 'stop' ]; then
  if [ -e $LockFile ];then
    rm -f $LockFile &> /dev/null
    echo "Stopping $SvcName finished."
  else
    echo "$SvcName is stopped yet."
  fi
elif [ $1 == 'restart' ]; then
  rm -f $LockFile &> /dev/null
  touch $LockFile &> /dev/null
  echo "Restarting $SvcName successfully."
elif [ $1 == 'status' ]; then
  if [ -e $LockFile ]; then
    echo "$SvcName is running."
  else
    echo "$SvcName is stopped."
  fi
else
  echo "Usage: $SvcName {start|stop|restart|status}"
  exit 4
fi

 

3. 条件判断中的组合符

当判断的条件不只一个时,需要用到组合符

-a 和,表示两端条件都要满足

-o 并,表示两端条件只要满足一个就好

! 非,与后面的条件相反

例1: 输入一个数字,若大于1并且小于100,输出"available",否则输出"invalid input"

1
2
3
4
5
6
7
#!/bin/bash
read -p "please input a number: " num
if [ $num -gt 1 -a $num -lt 100 ];then
    echo "available"
else
    echo "invalid input"
fi

 

4. 短路运算符

短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;

与运算:

假 && {真|假} = 假

 

或运算:

真 || (真,假) = 真

例1:判断目录/tmp/test是否存在,不存在的话,就新建该目录,存在的话,就输出"derictory exists"

1
[ -d /tmp/test ] || mkdir /tmp/test && echo "directory exists"
4
3
分享到:
评论

相关推荐

    UNIX命令及SHELL编程

    17_基础shell编程-条件测试.PDF 18_基础shell编程-控制流结构.PDF 19_基础shell编程-shell 函数.PDF 20_基础shell编程-向脚本传递参数.PDF 21_基础shell编程-创建屏幕输出.PDF 22_基础shell编程-创建屏幕输入....

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    第十七章 条件测试 第十八章 控制流结构 第十九章 SHELL函数 第二十章 向脚本传递参数 第二一章 创建屏幕输出 第二二章 创建屏幕输入 第二三章 调试脚本 第二四章 SHELL嵌入命令 第五部分 高级SHELL编程技巧...

    LINUX与UNIX SHELL编程指南

    第十七章 条件测试 第十八章 控制流结构 第十九章 SHELL函数 第二十章 向脚本传递参数 第二一章 创建屏幕输出 第二二章 创建屏幕输入 第二三章 调试脚本 第二四章 SHELL嵌入命令 第五部分 高级SHELL编程技巧 第二五...

    高级shell编程.pdf

    - **条件测试与逻辑运算**:掌握各种测试构造(如`[ ]`、`[[ ]]`)、文件测试操作符、数值比较操作符,以及如何构建复杂的条件语句。 - **算术与逻辑操作**:了解Shell中的基本算术运算和逻辑运算,包括双括号构造`...

    linux下shell编程

    - **条件测试**:使用 `[ ]` 或者 `test` 命令来进行条件判断,例如检查文件是否存在或者比较两个字符串是否相等。 - **循环结构**:支持 `for` 循环和 `while` 循环,可以用来重复执行一系列命令直到满足特定条件...

    Linux Shell编程3/3

    _grep家族 |_awk介绍 |_sed用法介绍 |_合并与分割 |_tr用法 第三部分登录环境 |_登录环境 |_环境和shell变量 |_引号 第四部分基础shell编程 |_shell脚本介绍 |_条件测试 |_控制...

    Shell编程详解,shell入门,shell实例

    1. **条件测试**:`if`、`else`、`elif`用于条件判断,如`if [ -f "file" ]; then ... fi`检查文件是否存在。 2. **循环**:`for`、`while`和`until`用于循环操作。例如,`for i in {1..10}; do echo $i; done`会...

    2本linux shell 编程chm

    Linux Shell编程是Linux系统管理与自动化任务的核心技术之一,它主要指的是使用Shell脚本来执行一系列命令,实现自动化操作。在Linux环境中,Bash(Bourne-Again SHell)是最常用的Shell,也是许多Linux发行版的默认...

    LINUX与UNIX SHELL编程指南(很全)

    第四部分 基础shell编程 第16章 shell脚本介绍 151 16.1 使用shell脚本的原因 151 16.2 脚本内容 151 16.3 运行一段脚本 152 16.4 小结 153 第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 ...

    UNIX.Shell编程24学时教程

    而在UNIX环境中,Shell编程是提升工作效率的关键技能之一。本教程“UNIX Shell编程24学时教程”旨在帮助初学者快速掌握这一核心技术。 1. **Shell介绍** - Shell是UNIX系统上的一个命令解释器,它提供了用户与操作...

    Shell编程大全 高清PDF版

    - 条件表达式与测试命令:学习if、elif、else语句,以及test和[[命令]用于条件判断。 - 循环结构:掌握for、while、until循环的用法,以及如何处理数组。 - 函数定义与调用:了解如何在Shell脚本中创建和使用函数...

    Linux Shell编程.

    ### Linux Shell编程知识点详解 #### 一、Shell编程概述 **Shell** 在 Unix/Linux 系统中扮演着极其重要的角色,既是用户与操作系统交互的主要接口,也是一种强大的编程语言。通过 Shell 编程,用户不仅可以自动化...

    实验报告2_shell及shell编程.doc

    实验报告2 Shell及Shell编程主要关注Bash shell的使用,包括其功能、配置文件、脚本编写和常用命令。在Linux或Unix系统中,Shell是用户与操作系统交互的界面,Bash是最常用的Shell之一。 1. **Bash配置文件**: - ...

    shell编程.pdf

    ### Shell编程知识点详解 #### 一、Shell编程概述 **Shell**是一种计算机操作系统中的命令解释器,也是用户与操作系统交互的主要方式之一。Shell脚本则是通过编写一系列命令和控制结构来自动化复杂的任务处理过程...

    linux与unix shell编程指南19-20.rar_Linux与Unix SHELL编程指南_linux shell编程

    `[ -f "$filename" ]`是一个条件测试,判断文件是否存在。双引号用于防止变量中的空格导致问题。 流程控制结构还包括函数定义,允许我们将代码组织成可重用的模块。此外,shell支持命令替换、命令别名、管道和...

    LINUX与UNIX Shell编程指南

    Shell编程则是提高效率、自动化任务的关键技能。本指南将深入探讨LINUX与UNIX Shell编程,帮助你掌握这一强大的工具。 一、Shell简介 Shell是Linux和Unix系统中的一个命令解释器,它接收用户输入的命令,解析并执行...

Global site tag (gtag.js) - Google Analytics