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

2)case语句

    语法格式:

        case 变量引用 in

        PATTERN1)

            分支1

            ;;

        PATTERN2)

            分支2

            ;;

        ...

        *)

        分支n

        ;;

        esac

    PATTERN:类同于文件名通配机制,但支持使用“|”表示或者

    a|b: a或者b

    *:匹配任意长度的任意字符

    ?: 匹配任意单个字符

    []: 指定范围内的任意单个字符


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/下的文件名也要随之而变;

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
[root@server 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

    上面的脚本也可以用case语句结合函数来实现。

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 一般情况下,case与函数一起使用的居多。
 
#!/bin/bash
 
if  [ $ # -lt 1 ];then
         echo  "Usage: `basename $0` {start|stop|restart|status}"
         exit  2
fi
 
[ $UID - ne  0 ] &&  echo  "permission denied."  &&  exit  5
 
if  [ ! -d  /var/lock/subsys  ]; then
     /bin/mkdir  -p  /var/lock/subsys
fi
 
service_name=` basename  $0`
ser_path= "/var/lock/subsys/$service_name"
start() {
     if  [ !  -e  "$ser_path"  ]; then
        /bin/touch   "$ser_path" 
         echo  "Starting $service_name successfully."
     else 
         echo  "$service_name is already start."
     fi 
}
 
stop() {
     if  [ -e  "$ser_path"  ]; then
         /bin/rm  -f   "$ser_path"
         echo   "Stop $service_name successfully."
     else
         echo  -e  "Stopping $service_name \033[31mFAILED\033[0m."
     fi
}
 
status() {
     if  [ -e  "$ser_path"  ]; then
         echo  "$service_name is running..."
     else
         echo  "$service_name is stopped."
     fi
}
 
other() {
     echo  "Usage: $service_name {start|stop|restart|status}"
     exit  4
}
 
case  "$1"  in
   start)
     start
     ;;
   stop)
     stop
     ;;
   status)
     status
     ;;
   *)
     other
     ;;
esac


四、其他

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是要踢掉的参数个数

1
2
3
4
5
6
7
8
9
10
11
12
[root@server scripts] # cat ./aboutshift 
#!/bin/bash
 
echo  $1
shift  #踢掉2个参数
echo  $1
shift  #踢掉3个参数
echo  $1
[root@server scripts] # ./aboutshift 1 2 3 4 5 6 7 8 9 10
1
3
6

    而shift真正的作用是,判断脚本参数的问题。例如:

写一个脚本,使用形式如下所示

    showifinfo.sh [-i INTERFACE|-a] [-v]

要求:

    1、-i或-a不可同时使用,-i用于指定特定网卡接口,-a用于指定所有接口;

        显示接口的ip地址

    2、使用-v,则表示显示详细信息

        显示接口的ip地址、子网掩码、广播地址;

    3、默认表示仅使用-a选项;

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
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash
#
# 通过这种方法来判断一个脚本的参数选项
 
verbose=0
allInterface=0
ifflag=0
 
while  [ $ # -ge 1 ]; do
     case  $1  in
     -a)
     allInterface=1
         shift  1
     ;;
      -i)
     ifflag=1
     interface= "$2"
    shift  2
     ;;
      - v )
     verbose=1
     shift
     ;;
      *)
     echo  "wrong option"
     exit  2
     ;;
      esac
done
 
[ $ifflag - eq  1 -a $allInterface - eq  1 ] &&  "Usage Error."  &&  exit  12
     
if  [ $allInterface - eq  1 || $ # -eq 0 ]; then
     if  [ $verbose - eq  1 ];  then
     ifconfig  grep  "inet addr:"
     else
     ifconfig  grep  "inet addr:"  awk  '{print $2}' 
     fi
fi
 
if  [ $ifflag - eq  1 ];  then
     if  [ $verbose - eq  1 ];  then
     ifconfig  $interface |  grep  "inet addr:"
     else
     ifconfig  $interface |  grep  "inet addr:"  awk  '{print $2}' 
     fi
fi     









本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1436505,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
465 9
|
3月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
392 2
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
701 1
|
7月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
343 13
|
7月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
233 4
|
7月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
462 3
|
8月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
716 25
|
8月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
201 18
|
10月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
804 32