Shell 编程基础(续):流程控制与实践

目录

前言

一、流程控制结构

[1.1 条件判断语句](#1.1 条件判断语句)

[1.1.1 if 语句](#1.1.1 if 语句)

二、输入输出重定向

[2.1 输出重定向](#2.1 输出重定向)

[2.2 输入重定向](#2.2 输入重定向)

[2.3 管道](#2.3 管道)

总结


前言

在上一篇博客中,我们已经学习了 Shell 编程的基础知识,包括 Shell 脚本的概念、变量定义与使用、位置参数以及基本运算符等内容。本文作为续篇,将重点讲解 Shell 编程中的核心部分 ------ 流程控制结构,包括条件判断、循环语句、函数定义与调用等关键知识点。掌握这些内容,能够帮助你编写逻辑更复杂、功能更强大的 Shell 脚本,实现自动化任务处理和系统管理。

一、流程控制结构

流程控制是编程中的核心概念,它决定了程序中语句的执行顺序。Shell 提供了丰富的流程控制结构,包括条件判断、循环语句和函数等。这也实现了运维在生产过程中的自动化管理。

1.1 条件判断语句

条件判断允许程序根据不同的条件执行不同的代码块。在 Shell 中,最常用的条件判断语句是if语句和case语句。

1.1.1 if 语句

if语句是 Shell 中最基本的条件判断结构,它的基本语法如下:(单支)

复制代码
if [ 条件表达式 ]; then
    # 条件为真时执行的命令
fi

除了基本的if结构,还有(双支)if-else和(多支)if-elif-else结构,用于处理多种条件情况:

在条件表达式中,常用的比较运算符有:

  • 数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)
  • 字符串比较:=(等于)、!=(不等于)、-z(空字符串)、-n(非空字符串)
  • 文件测试:-f(普通文件)、-d(目录)、-e(存在)、-r(可读)、-w(可写)、-x(可执行)

示例:

①单支

案例一:

②双支

案例一:

案例二:

案例三:

bash 复制代码
1.命令组合与管道操作
# 使用 netstat -antulp| grep ":80" 组合命令,通过管道 | 将 netstat 的输出传递给 grep 过滤包含 ":80" 的内容,实现对 80 端口状态的检查
# netstat -antulp 用于显示系统中所有监听的网络连接和相关进程信息

2.退出状态码的显式引用
# 使用 $? 获取上一条命令的退出状态码,$? -eq 0 表示上一条命令执行成功

3.系统服务管理
# 使用 systemctl restart httpd 重启 httpd 服务,这是 systemd 系统中管理服务的标准命令
# 通过 yum install -y httpd 安装 httpd 软件包,-y 选项用于自动确认安装过程中的所有提示
嵌套条件判断
采用 if...else 嵌套结构,在第一个条件不满足时,再进行第二层条件判断

案例四:

bash 复制代码
1.命令退出状态码的利用
# Shell 中,if 语句判断的核心是其后命令的退出状态码:
当 ls $a 执行成功(路径存在),退出状态码为 0,if 条件成立,执行 then 分支;
当 ls $a 执行失败(路径不存在),退出状态码非 0,if 条件不成立,执行 else 分支。
这是 Shell 中通过命令执行结果判断逻辑的典型方式。

2.标准输出重定向
ls $a > /dev/null 中,> 是输出重定向符号,/dev/null 是特殊的 "空设备" 文件:
作用是将 ls 命令的正常输出(如目录内容列表)丢弃,避免干扰脚本的最终输出,只保留判断逻辑。
这种方式常用于 "只关注命令是否执行成功,不关心具体输出内容" 的场景。

③多支

案例一:

复制代码
[root@77 shelldemo]# ./demo06.sh
快输:/etc
目录啦
[root@77 shelldemo]# vim demo06.sh
[root@77 shelldemo]# ./ demo06.sh
-bash: ./: 是一个目录
[root@77 shelldemo]# ./demo06.sh
快输:/zz
目录啦
[root@77 shelldemo]# ./demo06.sh
快输:/etc/root
不知道什么鬼玩意儿
[root@77 shelldemo]# ./demo06.sh
快输:/zz/shelldemo/err.txt
文件文件
bash 复制代码
1.交互输入
使用 read -p "快输:" a 实现与用户的交互,-p 选项用于显示提示信息,将用户输入的内容保存到变量 a 中

2.条件判断结构
# 使用 if...elif...else 多分支条件判断结构,根据不同的条件执行相应的操作
# 条件判断的基本格式 [ 条件表达式 ],注意括号前后需要有空格

3.文件类型检测运算符
-d $a:判断变量 a 所表示的路径是否为目录(directory)
-f $a:判断变量 a 所表示的路径是否为普通文件(file)
-e $a:判断变量 a 所表示的路径是否存在(exist)
-b $a:判断变量 a 所表示的路径是否为块设备文件(block device)

4.执行逻辑
脚本会按照从上到下的顺序依次判断条件
一旦某个条件满足,就会执行对应的 echo 语句并退出整个条件判断结构
如果所有条件都不满足,则执行 else 部分的语句

二、输入输出重定向

在 Shell 中,每个进程都有三个默认的文件描述符:

标准输入(stdin,0)

标准输出(stdout,1)

标准错误(stderr,2)。

输入输出重定向允许我们改变这些默认的输入输出方向。

2.1 输出重定向

输出重定向用于将命令的输出保存到文件中,而不是显示在屏幕上:

  • >:覆盖模式,将输出写入文件,会覆盖文件原有内容
  • >>:追加模式,将输出添加到文件末尾,不会覆盖原有内容

2.2 输入重定向

输入重定向用于从文件中读取输入,而不是从键盘输入。

2.3 管道

管道(|)用于将一个命令的输出作为另一个命令的输入,这是 Shell 中非常强大的功能。

总结

bash 复制代码
1. &&:左成功,才执行右
2. ||:左失败,才执行右
3. > :覆盖stdout
   >>: 追加stdout
   2>和2>>用于stderr
   将stderr指向stdout:2>&1
   (顺序重要)
   同时重定向stdout+stderr :>file 2>&1(POSIX),或 &>file (bash)
4.丢弃输出:>/dev/null/ 2>/dev/null
5.管道|只传stdout; 要传两者用 2>&1 | 或 |& (bash)

今日份案例分享就到这里啦,明天继续哟~

相关推荐
A小辣椒3 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒6 小时前
TShark:基础知识
linux
AlfredZhao9 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式