Linux Shell编程之二选择结构

Shell编程学习之二

一、bash的条件测试

测试方法或者说测试书写:

test EXPR

[ EXPR ]

[[ EXPR ]]

例如:测试变量 User_Name 的之是否为root

test $User_Name="root"

[ $User_Name == "root" ]

[[ $User_Name == "root" ]

根据比较时操作数的类型,测试类型分为:

测试类型 运算符 运算符所代表的意义 示例
整形测试
-gt -lt -ge -le

-eq -ne


-gt 大于  -lt 小于

-ge 大于或等于  -le 小于或等于

-eq 等于  -ne 不等于


都是双目运算符:

[ $num -gt 3 ]

test $num -ne $sum

[[ $num -ne 0 ]]

字符测试 == =~ > < !=
== 等于   >大于    < 小于

!= 不等于   =~ 模式匹配


都是双目运算符:

[ $num == "root"]

test $num > $sum

[[ "$num" =~ /bin/bash$ ]]

这里注意 =~只能用 [[ ]]去匹配,而且=~后面的PATTERN(模式)不能使用"",‘‘等引用字符

-n -z
-z 测试文件内容是否为空,为空时真,不为空为假

-n 测试文件内容是否为不空,不空为真,空为假


单目运算符

[ -n "$file_name" ]

文件测试
-a|e -f -L|h -d

-b -c -S -p -s

-r -w -x -N


-a|e 测试文件存在

-f 测试文件为一般文件

-L|h 测试文件为软连接文件

-d 测试文件是否为目录

-b -c -p -S 测试文件为块设备、字符设备、管道文件、socket文件

-r -w -x 测试文件可读、可写、可执行

-s 测试文件为空文件

-N 测试文件Mtime新于Atime


都是单目运算符

[ -f "$file_name" ]

[[ -b "$file_name" ]]

test -x $file_name

-nt -ot
file1 -nt file2 file1的Mtime新于file2的Mtime

file1 -ot file2 file1的Mtime旧于file2的Mtime


双目运算符

[ file1 -nt "$file_name" ]

[[ $file1 -ot "$file_name" ]]

二、逻辑运算

布尔运算:布尔运算的结果只有2中:真和假。

常见的逻辑运算有:与 或 非 异或。与或非常用 && || ! 来表示。

与的逻辑关系:

假 && 任意
真 && 真

或的逻辑关系:

真 || 任意
假 || 假

非的逻辑关系:

!假
!真

异或的逻辑关系:相同为假,不同为真

三、选择

bash中的选择语句通常有if,case。当然if,case在大多数情况下是可以相互转换的。

1)if选择语句

1、单分支if语句:

if CONDITION;then

选择分支

fi

2、双分支的if语句:

if CONDITION;then

选择分支1

else

选择分支2

fi

3、多分支的if语句:

if CONDITION1;then

选择分支1

elif CONDITION2;then

选择分支2

elif CONDITION3;then

选择分支3

...

else

选择分支n

fi

4、练习

写一个脚本,完成如下任务,其使用形式如下所示:

script.sh {start|stop|restart|status}

其中:

如果参数为空,则显示帮助信息,并退出脚本;

如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”

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

如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”

如果参数为status,那么:

如果文件/var/lock/subsys/script存在,则显示“Script is running...”,否则,则显示“Script is stopped.”

说明:script.sh是脚本文件名,在创建时,其名称可以自己随意定义,但如果其名称发生变量,上/var/lock/sussys/下的文件名也要随之而变;

[[email protected] scripts]# cat myhttpd
#!/bin/bash
#
# Description: 
# Version: 0.0.1
# Author: Alex
# Date: 2014-07-09

#判断参数个数,如果参数小于1,则提示用法并退出
if [ $# -lt 1 ];then
        echo "Usage: `basename $0` {start|stop|restart|status}"
        exit 2
fi
#判断/var/lock/subsys是否存在,不存在则创建此目录
if [ ! -d /var/lock/subsys ];then
	/bin/mkdir -p /var/lock/subsys
fi

if [ "$1" == "start" ];then
#如果/var/lock/subsys/`basename $0`文件不存在,则创建,并显示启动成功;若存在则提示已启动
	[ !  -e "/var/lock/subsys/`basename $0`" ] && /bin/touch  "/var/lock/subsys/`basename $0`" && echo "Starting `basename $0` successfully." 	||  echo "`basename $0` is already start."
elif [ "$1" == "stop" ];then
#如果/var/lock/subsys/`basename $0`文件存在,则删除,并显示关闭成功;若不存在则显示关闭失败
	[ -e "/var/lock/subsys/`basename $0`" ] && /bin/rm -f  "/var/lock/subsys/`basename $0`" && echo  "Stop myhttpd successfully." 	|| echo -e "Stopping myhttpd \033[31mFAILED\033[0m."
elif [ "$1" == "status" ];then
#如果/var/lock/subsys/`basename $0`文件存在,显示running;若不存在则提示stopd
	[ -e "/var/lock/subsys/`basename $0`" ] && echo "`basename $0` is running..." || echo "`basename $0` is stopped."
else
	echo "Usage: `basename $0` {start|stop|restart|status}"
fi

四、其他

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

与:[ condition1 -a condition2 ]

condition1 && condition2

或:[ condition1 -o condition2 ]

condition1 || condition2

非:[ -not condition ]

! condition

2、bash编程之交互编程

read 与用户交互进行

-p "prompt" 提示语句

-t timeout 设置超时时间

3、exit

程序退出语句,一般是 exit n 这样使用,n是错误状态值。

4、shift

通常是shift n 这样使用,n是要踢掉的参数个数

[[email protected] scripts]# cat ./aboutshift 
#!/bin/bash

echo $1
shift 2 #踢掉2个参数
echo $1
shift 3 #踢掉3个参数
echo $1
[[email protected] scripts]# ./aboutshift 1 2 3 4 5 6 7 8 9 10
1
3
6

未完待续....

Linux Shell编程之二选择结构,布布扣,bubuko.com

时间: 2024-10-01 06:13:10

Linux Shell编程之二选择结构的相关文章

Linux shell编程(二):shell语法

shell 语法 shell 执行命令操作 当shell读取输入时,它将执行一系列操作.如果输入表示注释的开头,则shell将忽略注释符号('#')和该行的其余部分. shell 读取和执行命令时将经过下列操作: 从一个文件(Shell脚本)中读取它的输入,从作为参数的字符串到 "-c" 调用选项(调用Bash),或者从用户的终端. 将输入拆分为单词和操作符,遵守所描述的引用规则.这些标记由"元字符"分隔.此步骤执行别名扩展. 将令牌解析为简单的复合命令. 执行各种

linux shell编程(二) 条件测试

bash中常用的条件测试有三种 条件测试的表达式:[ expression ]  [[ expression]] 第一种:整数测试: -eq 测试两个整数是否相等,比如[ $A -eq $B ] -ne 测试两个整数不等 -gt 测试一个数是否大于另一个数 (great than) -lt 测试一个数是否小于另一个数 (less than) -ge 大于等于 -le 小于等于 -ne 不等于 第二种:文件测试: -e 文件名字或者文件路径 测试文件是否存在 eg:[-e /etc/inittab

Linux Shell 编程实战技巧

目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞争力的技能.本文就笔者的实际开发经验,以 Korn Shell 为例分享了脚本开发中的常见问题及相关技巧. 避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接

shell编程(二)---shell脚本说明

脚本:命令的堆砌,根据实际情况,结合命令流程控制机制实现的源程序. 脚本的内容说明: 1. 以shebang开始,即#!/bin/bash.这里指定的是脚本解释器的路径. 2. 以#开始的表示注释,用于说明脚本的功能和作用. 3. 脚本的执行:可以直接给脚本赋予x权限,通过使用脚本所在的路径执行脚本,或者是脚本所在的目录添加到PATH变量中. 4. 如果通过sh的方式执行脚本时,脚本可以不需要具有x权限,并且脚本里面的第一行也可以不要写shebang. 示例1: [[email protecte

Linux Shell常用技巧(二)

七. grep家族:       1.  grep退出状态:    0: 表示成功:    1: 表示在所提供的文件无法找到匹配的pattern:    2: 表示参数中提供的文件不存在.    见如下示例:    /> grep 'root' /etc/passwd    root:x:0:0:root:/root:/bin/bash    operator:x:11:0:operator:/root:/sbin/nologin    /> echo $?    0        />