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

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编程-创建屏幕输入....

    shell 编程指南pdf

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

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

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

    LINUX与UNIX SHELL编程指南

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

    Linux Shell编程3/3

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

    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 测试时使用逻辑操作符 ...

    Shell编程大全.pdf

    所有shell编程用到的技术详解, 第1章 文件安全与权限 2章 使用find和xargs 3章 后台执行命令 4章 文件名置换 5章 shell输入与输出 ...16章 条件测试 17章 控制流结构 18章 函数 19章 向脚本传递参数

    绝版高清经典Linux与UNIX_Shell编程指南中文版

    条件测试 控制流结构 shell 函数 向脚本传递参数 创建屏幕输出 创建屏幕输入 调试脚本 shell嵌入命令 高级shell编程 深入讨论 shell工具 几个脚本例子 运行级别脚本 cgi脚本 常用shell命令

    Linux与unix shell编程指南

    第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 155 17.3 字符串测试 155 17.4 测试数值 156 17.5 expr用法 157 17.5.1 增量计数 158 17.5.2 数值测试 158 17.5.3 模式匹配 158 17.6 小结 ...

    跟老男孩学Linux运维:Shell编程实战 part3

    第二部分为第5章~第8章,着重讲解变量的多种数值运算、条件测试与比较、if条件判断语句、Shell函数等相关的知识。第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、...

    Shell编程范例之布尔运算-TinyLab原创

    本文由TinyLab.org原创。 本文是自由书籍《Shell...对它们可以进行与、或、非运算等常规的逻辑运算,在这一节,我们除了讨论这些基本逻辑运算外,还将讨论SHELL编程中的条件测试和命令列表,并介绍它们和布尔运算的关系。

    shell 编程(中文)[pdf]

    016_基础shell编程_shell脚本介绍.pdf 017_条件测试_test_expr.pdf 018_控制流结构_if_for_while_case_util_break_continue.pdf 019_Shell函数.pdf 020_向脚本传递参数_shift_getops.pdf 021_创建屏幕输出_tput.pdf ...

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》第二部分为第5章~第8章,着重讲解变量的多种数值运算、条件测试与比较、if条件判断语句、Shell函数等相关的知识。《跟老男孩学Linux运维:Shell编程实战》第三部分为第9章~第...

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    第17章 条件测试 154 第18章 控制流结构 160 第19章 shell函数 202 第20章 向脚本传递参数 224 第21章 创建屏幕输出 236 第22章 创建屏幕输入 252 第23章 调试脚本 274 第24章 shell嵌入命令 277 第五部分 高级...

    Linux与UNIX Shell编程指南.rar

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

    LINUX与UNIX SHELL编程指南 高清PDF

    第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 155 17.3 字符串测试 155 17.4 测试数值 156 17.5 expr用法 157 17.5.1 增量计数 158 17.5.2 数值测试 158 17.5.3 模式匹配 158 17.6 小结 ...

    shell编程 linux

    017条件测试.pdf 018控制流结构.pdf 019shell 函数.pdf 020向脚本传递参数.pdf 021创建屏幕输出.pdf 022创建屏幕输入.pdf 023调试脚本.pdf 024shell嵌入命令.pdf 025深入讨论.pdf 026shell 工具.pdf 027...

    Linux实验八 shell编程(一)

    【实验目的】 1、了解shell的概念 2、了解shell变量的种类...1、掌握shell编程的方法。 2、掌握shell的特殊字符,条件测试。 【实验内容】 1.Shell变量的定义及其使用。 2.位置参数和环境变量。 3.Shell中的特殊字符。

Global site tag (gtag.js) - Google Analytics