Shell 编程之条件语句

  在当今的信息时代,Linux系统的灵活性和强大功能使其成为了许多企业和个人用户的首选操作系统。随着对Linux系统的深入使用,我们经常需要编写脚本来自动化日常任务,提高工作效率。在这个过程中,条件测试和条件语句发挥着至关重要的作用。它们使我们能够根据不同的条件执行不同的命令,从而使脚本更加智能和灵活。

  条件测试允许我们检查文件属性、比较数值、检查字符串内容等,而条件语句(如if语句和case语句)则根据这些测试的结果来决定执行哪些命令。无论是简单的文件存在性检查,还是复杂的逻辑判断,Linux都提供了丰富的工具和语法来满足我们的需求。

第一部分:条件测试操作

  在Linux系统中,条件测试是脚本编写中不可或缺的一部分,它允许我们根据文件、字符串或数值的特定条件来执行相应的命令。以下是条件测试操作的详细介绍,包括文件测试、整数值比较、字符串比较和逻辑测试。

1. 文件测试

  文件测试是Linux系统中非常常见的一种操作,用于检查文件或目录的存在性、类型及其权限等。文件测试可以帮助我们在脚本中做出更智能的决策,避免因文件或目录不存在而导致的错误。以下是一些常见的文件测试操作及其详细解释:

1.1 检查目录是否存在

在Linux中,我们可以使用​​-d​​选项来检查一个目录是否存在。以下是一个示例:

[root@localhost ~]# [ -d /media/cdrom ]
[root@localhost ~]# echo $?
0

  在这个示例中,[ -d /media/cdrom ]命令用于检查/media/cdrom目录是否存在。如果目录存在,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为0,表示目录存在。

1.2 检查文件是否存在

类似地,我们可以使用​​-f​​选项来检查一个文件是否存在。以下是一个示例:

[root@localhost ~]# [ -f /etc/passwd ]
[root@localhost ~]# echo $?
0

  在这个示例中,[ -f /etc/passwd ]命令用于检查/etc/passwd文件是否存在。如果文件存在,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为0,表示文件存在。

1.3 检查文件是否可读

我们可以使用​​-r​​选项来检查一个文件是否可读。以下是一个示例:

[root@localhost ~]# [ -r /etc/passwd ]
[root@localhost ~]# echo $?
0 

  在这个示例中,[ -r /etc/passwd ]命令用于检查/etc/passwd文件是否可读。如果文件可读,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为0,表示文件可读。

1.4 检查文件是否可写

我们可以使用​​-w​​选项来检查一个文件是否可写。以下是一个示例:

[root@localhost ~]# [ -w /etc/passwd ]
[root@localhost ~]# echo $?
0

   在这个示例中,[ -w /etc/passwd ]命令用于检查/etc/passwd文件是否可写。如果文件可写,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为0,表示文件可写。

1.5 检查文件是否可执行

我们可以使用​​-x​​选项来检查一个文件是否可执行。以下是一个示例:

[root@localhost ~]# [ -x /etc/passwd ]
[root@localhost ~]# echo $?
1

   在这个示例中,[ -x /etc/passwd ]命令用于检查/etc/passwd文件是否可执行。如果文件可执行,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为1,表示文件不可执行。

1.6 检查文件是否为空

我们可以使用​​-s​​选项来检查一个文件是否为空。以下是一个示例:

[root@localhost ~]# [ -s /etc/passwd ]
[root@localhost ~]# echo $?
0

   在这个示例中,[ -s /etc/passwd ]命令用于检查/etc/passwd文件是否为空。如果文件不为空,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为0,表示文件不为空。

1.7 检查文件是否是符号链接

我们可以使用​​-L​​选项来检查一个文件是否是符号链接。以下是一个示例:

[root@localhost ~]# [ -L /etc/passwd ]
[root@localhost ~]# echo $?
1

  在这个示例中,[ -L /etc/passwd ]命令用于检查/etc/passwd文件是否是符号链接。如果文件是符号链接,命令的返回值为0,否则返回值为1。echo $?命令用于显示上一个命令的返回值。在这个例子中,返回值为1,表示文件不是符号链接。

  以上是文件测试的基本操作,通过这些测试,我们可以在脚本中做出更智能的决策,确保操作的安全性和正确性

2. 整数值比较 

在编写脚本时,经常需要根据整数值进行条件判断。Linux提供了一系列的操作符来进行整数值之间的比较:

  • ​-eq​​:等于。如果两个整数相等,则返回真。
  • ​-ne​​:不等于。如果两个整数不相等,则返回真。
  • ​-gt​​:大于。如果左边的整数大于右边的整数,则返回真。
  • ​-lt​​:小于。如果左边的整数小于右边的整数,则返回真。
  • ​-ge​​:大于等于。如果左边的整数大于或等于右边的整数,则返回真。
  • ​-le​​:小于等于。如果左边的整数小于或等于右边的整数,则返回真。

使用这些操作符,我们可以构建复杂的逻辑判断,以控制脚本的执行流程。

3. 字符串比较

  除了整数值比较,字符串比较也是脚本编写中的重要组成部分。以下是一些常用的字符串比较操作:

  • ​=​​:检查两个字符串是否相等。如果相等,则返回真。
  • ​!=​​:检查两个字符串是否不相等。如果不相等,则返回真。
  • ​-z​​:检查字符串是否为空。如果为空,则返回真。
  • ​-n​​:检查字符串是否非空。如果非空,则返回真。

字符串比较允许我们根据用户输入或文件内容等进行条件判断,从而使脚本更加灵活和智能。

4. 逻辑测试

  逻辑测试在脚本编写中非常重要,因为它允许我们组合多个条件来进行复杂的判断。以下是逻辑AND(​​&&​​​)、逻辑OR(​​||​​​)和逻辑NOT(​​!​​)操作符的详细介绍及其示例。

4.1 逻辑AND(&&

  逻辑AND操作符用于连接两个条件,只有当两个条件都为真时,整个表达式才为真。以下是一个示例:

[root@localhost ~]# [ -d /media/cdrom ] && [ -r /media/cdrom ]
[root@localhost ~]# echo $?
0

  在这个示例中,[ -d /media/cdrom ]检查/media/cdrom目录是否存在,[ -r /media/cdrom ]检查该目录是否可读。只有当这两个条件都为真时,整个表达式才为真,返回值为0。

4.2 逻辑OR(||

逻辑OR操作符用于连接两个条件,只要有一个条件为真,整个表达式就为真。以下是一个示例:

[root@localhost ~]# [ -d /media/cdrom ] || [ -d /mnt/cdrom ]
[root@localhost ~]# echo $?
0

  在这个示例中,[ -d /media/cdrom ]检查/media/cdrom目录是否存在,[ -d /mnt/cdrom ]检查/mnt/cdrom目录是否存在。只要有一个目录存在,整个表达式就为真,返回值为0。

4.3 逻辑NOT(!

  逻辑NOT操作符用于反转条件的真假值。以下是一个示例:

[root@localhost ~]# [ ! -d /media/cdrom ]
[root@localhost ~]# echo $?
1

  在这个示例中,[ ! -d /media/cdrom ]检查/media/cdrom目录是否不存在。如果目录不存在,条件为真,返回值为0;如果目录存在,条件为假,返回值为1。在这个例子中,返回值为1,表示目录存在。

4.4 组合逻辑测试

  我们可以组合使用逻辑AND、逻辑OR和逻辑NOT操作符来构建复杂的逻辑判断。以下是一个示例:

[root@localhost ~]# [ -d /media/cdrom ] && [ -r /media/cdrom ] || [ -d /mnt/cdrom ]
[root@localhost ~]# echo $?
0

  在这个示例中,首先检查/media/cdrom目录是否存在且可读。如果这两个条件都为真,整个表达式为真,返回值为0。如果其中一个条件为假,则继续检查/mnt/cdrom目录是否存在。如果/mnt/cdrom目录存在,整个表达式为真,返回值为0。

  通过这些示例,我们可以看到,逻辑测试在脚本编写中非常有用。它们允许我们根据多个条件来控制脚本的执行路径,从而编写出更加智能和灵活的脚本来自动化处理各种任务。

第二部分:if语句的深入解析 

   在Linux脚本编程中,if语句是实现条件控制的基础,它允许根据条件的真假来执行不同的命令或代码块。if语句的灵活性和强大功能是编写高效、智能脚本的关键。

if语句的基本结构 

​if​​语句的基本结构如下:

if [ 条件 ]; then
    命令或代码块
f

  这里的[ 条件 ]是一个表达式,用于评估条件的真假。如果条件为真(即表达式的返回值为0),则执行then后面的命令或代码块。fi标记了if语句的结束。

条件表达式

条件表达式是​​if​​语句的核心,它决定了是否执行特定的命令或代码块。在Linux中,条件表达式可以是文件测试、字符串比较、整数比较或者复合条件。

  • 文件测试:检查文件或目录的属性,如是否存在、是否可读写等。
  • 字符串比较:比较两个字符串是否相等或不等。
  • 整数比较:比较两个整数的大小。
  • 复合条件:使用逻辑运算符(如AND、OR和NOT)组合多个条件。

if语句的扩展形式 

​if​​​语句有几种扩展形式,包括双分支和多分支结构。

  • 双分支if语句(​​if-else​​):在条件为假时执行另一组命令或代码块。

  • 多分支if语句(​​if-elif-else​​):根据多个条件执行不同的命令或代码块。

 

if语句的作用和重要性

  ​​if​​​语句的作用在于提供了一种条件控制机制,使得脚本能够根据不同的条件执行不同的操作。这种能力是编写灵活、高效脚本的基础。通过合理使用​​if​​语句,我们可以:

  • 根据用户输入或程序状态做出响应。
  • 处理异常情况,增强脚本的健壮性。
  • 实现复杂的业务逻辑和流程控制。

  总之,​​if​​​语句是Linux脚本编程中不可或缺的一个组成部分。掌握​​if​​语句的使用,对于提高编程技能和编写高质量的脚本至关重要。

第三部分:使用case分支语句

  在Linux脚本编写中,case语句是一种非常有用的条件控制结构。它允许我们根据变量的不同值执行不同的命令或代码块。与if语句相比,case语句在处理多种可能的情况时更加简洁和高效。case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分

  别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个不同的条件,而 case 语句只是判断一个变量的不同取值。

1. 编写检查用户输入的字符类型的脚本

  我们可以使用​​case​​语句来编写一个脚本,检查用户输入的字符类型,并根据不同的字符类型输出相应的消息。

脚本示例:

[root@localhost ~]# vim hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
    echo "您输入的是 字母."
    ;;
[0-9])
    echo "您输入的是 数字."
    ;;
*)
    echo "您输入的是 空格、功能键或者其他控制字符."
    ;;
esac
[root@localhost ~]# chmod a+x hitkey.sh

测试并确认执行结果:

[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按Enter键:k
您输入的是 字母 k.

  在这个示例中,脚本首先提示用户输入一个字符,然后使用case语句检查输入的字符类型。如果输入的是字母(无论大小写),则输出“您输入的是 字母.”;如果输入的是数字,则输出“您输入的是 数字.”;否则,输出“您输入的是 空格、功能键或者其他控制字符.”。

2. 编写系统服务脚本

  我们还可以使用​​case​​语句编写一个简单的系统服务脚本,用于启动、停止、检查状态和重启服务。

脚本示例:

[root@localhost ~]# vim myprog
#!/bin/bash
case "$1" in
start)
    echo -n "正在启动sleep服务..."
    if sleep 7200 &
    then
        echo "ok"
    fi
    ;;
stop)
    echo -n "正在停止sleep服务..."
    pkill "sleep" &> /dev/null
    echo "ok"
    ;;
status)
    if pgrep "sleep" &> /dev/null ; then
        echo "sleep服务已经启动."
    else
        echo "sleep服务已经停止."
    fi
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "用法:$0 {start|stop|status|restart}"
    ;;
esac
[root@localhost ~]# chmod a+x myprog

测试并确认执行结果:

[root@localhost ~]# ./myprog start
正在启动sleep服务...ok
[root@localhost ~]# ./myprog status
sleep服务已经启动。
[root@localhost ~]# ./myprog stop
正在停止服务sleep服务...ok
[root@localhost ~]# ./myprog reload
用法:./myprog {start|stop|status|restart}

  在这个示例中,脚本根据传递的参数(start、stop、status或restart)执行不同的操作。如果参数是start,则启动sleep服务;如果参数是stop,则停止sleep服务;如果参数是status,则检查sleep服务的状态;如果参数是restart,则先停止再启动sleep服务。对于其他参数,脚本输出用法说明。

3.将myprog脚本添加为标准的系统服务

为了使脚本能够作为系统服务自动启动和停止,我们可以将其添加到系统的服务管理中。

[root@localhost ~]# vim myprog
#!/bin/bash
# chkconfig: - 90 10
# description: Startup script for sleep Server
case "$1" in
start)
    echo -n "正在启动sleep服务..."
    if sleep 7200 &
    then
        echo "ok"
    fi
    ;;
stop)
    echo -n "正在停止sleep服务..."
    pkill "sleep" &> /dev/null
    echo "ok"
    ;;
status)
    if pgrep "sleep" &> /dev/null ; then
        echo "sleep服务已经启动."
    else
        echo "sleep服务已经停止."
    fi
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "用法:$0 {start|stop|status|restart}"
    ;;
esac
[root@localhost ~]# cp myprog /etc/init.d/
[root@localhost ~]# chkconfig --add myprog
[root@localhost ~]# chkconfig --list myprog
[root@localhost ~]# service myprog start

备注:

# chkconfig: - 90 10    // 90是启动优先级,10是停止优先级,优先级范围是0-100,数字越大,优先级越低。

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值