Shell编程-规范

系列文章目录

` 提示:仅用于个人学习,进行查漏补缺使用。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

本章大概内容有:

Shell脚本概述、环境、应用场景、作用、编程规范、脚本运行方法、子Shell概念、脚本变量等

提示:以下是本篇文章正文内容,下面案例可供参考

Shell脚本概述

  • Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell脚本是一种命令解析器,是在Unix-like操作系统中用来批量处理任务的脚本程序。它通常由一系列命令组成,这些命令会被Shell一一执行。
  • Shell脚本可以用来自动化日常任务,编写系统管理脚本,甚至是开发复杂的应用程序。
  • Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
  • Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种Shell控制语句以完成更复杂的操作

Shell环境

  • 检查一下/etc/shells这个文件,里面就是Linux所包含的Shell。
常见的Shell环境 描述
Bourne Shell (/bin/sh) Unix的默认Shell,提供基本的命令行界面和执行功能。
Bash Bourne Shell的扩展,提供了更多的功能和特性,如数组和循环。
C Shell (csh) 基于Bourne Shell,增加了类C语言的语法和功能。
Korn Shell (ksh) 结合了Bourne Shell和C Shell的特点,提供了脚本编程的增强特性。
Z Shell (zsh) 功能强大的Shell环境,提供了自动补全、语法高亮等特性。
Tcsh C Shell的扩展,增加了命令历史和补全功能。
Dash Debian Almquist Shell,是Bourne Shell的一个轻量级实现,性能更优。
Fish 用户友好的Shell环境,提供了自动补全和语法高亮等特性。
  • _PS: _
    • 在一般情况下,并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh ,它同样也可以改为 #!/bin/bash
    • #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

Shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行
  • ...

Shell的作用

序号 应用场景 描述
1 自动化任务执行 Shell脚本可以将一系列命令组合起来,减少重复性工作,提高工作效率。
2 任务调度 Shell脚本可以用来设置定时任务,如每天、每周或每月自动执行某些操作。
3 数据处理 Shell脚本可以处理文件和数据,如数据排序、查找、替换等。
4 系统管理 Shell脚本可以用来管理系统的各个方面,如用户管理、文件系统管理、网络配置等。
5 程序开发 Shell脚本可以用来开发简单的程序,尤其是那些需要与操作系统紧密集成的程序。
6 测试 Shell脚本可以用来编写单元测试和集成测试,以确保软件的质量和稳定性。
7 日志分析 Shell脚本可以用来分析系统日志文件,帮助系统管理员诊断和解决问题。
8 数据备份和恢复 Shell脚本可以用来自动化数据备份和恢复过程,确保数据的安全性。
9 软件和配置 Shell脚本可以用来自动化软件的安装过程,简化复杂的配置任务。
10 定制化系统功能 Shell脚本可以根据特定需求定制化系统的某些功能,如自动发送报告、邮件提醒等。

Shell编程规范

规范类别 具体规范
文件命名 - 遵循Linux命名规则 - 使用字母、数字和下划线 - 以字母或下划线开头 - 避免使用保留字
脚本结构 - 声明解释器 - 赋予执行权限 - 采用缩进和空行
注释 - 使用#进行单行注释 - 放置版权信息和元数据
变量使用 - 定义变量使用my_variable="value" - 变量命名具有描述性 - 使用echo打印变量值
控制结构 - 一致的缩进风格 - 正确无误的条件判断和循环逻辑
错误处理 - 使用set -e停止错误执行 - 使用set -o pipefail处理管道错误 - 检查命令退出状态
资源管理 - 使用exitreturn结束脚本 - 使用trap处理信号
代码复用 - 使用函数封装代码块 - 通过函数参数传递数据,避免全局变量
避免危险操作 - 避免安全风险命令或操作 - 使用set -u避免未定义变量
性能优化 - 优化逻辑,减少资源消耗 - 使用缓存和临时文件提高性能
测试与验证 - 进行单元测试 - 使用检查列表验证执行结果

Shell脚本运行方法

  • 写一个shell脚本,创建一个test文件夹,在该文件夹vi写一个test.sh文件(扩展名sh代表shell脚本文件),编辑如下:

    #!/bin/bash ### #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
    echo "Hello World !" ### echo 命令用于向窗口输出文本。

  • 1. 作为可执行程序,但要求文件必须有x(可执行)权限

    • 当前路径/脚本程序

      [root@server test]# chmod +x /test/test.sh
      [root@server test]# ./test.sh
      Hello World !

  • 绝对路径/脚本程序

    [root@server test]# pwd
    /test
    [root@server test]# /test/test.sh
    Hello World !

  • **PS: **

    • 如果直接写 test.sh,linux 系统会去** PATH** 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在** PATH** 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 或/test.test.sh 告诉系统在哪里找到脚本运行。
  • 2.作为解释器参数

    • 直接运行解释器,其参数就是shell脚本的文件名,不要求文件必须有 x 权限。

      /bin/sh test.sh

  • PS:

    • 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
  • _3.source命令 _

    • source命令也称为"点命令",也就是一个点符号(.),是bash的内部命令

    • source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。

    • linux所有的操作都会变成文件的格式存在。

      [root@server test]# source /test/test.sh
      Hello World !

  • 补充

    • "source filename"与"sh filename"、"./filename"这三个命令都可以用于执行一个脚本文件,那么它们之间的区别又如何呢:
      • (1)当shell脚本具有可执行权限时,用sh filename与./filename是没有区别的。./filename是因为当前目录没有在PATH中,所以"."是用来表示当前目录的。
      • (2)sh会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。
      • ps -ef --forest 查看一个进程的父子进程关系
        • bash 会产生一个子shell,如进程关系,如shell脚本的/bin/bash,会产生一个子shell进程

子shell的概念(shell列表的理念)

  • **目的: **多进程并行处理任务
    • 小括号()表示开启子shell列表,小括号中引用的命令表示嵌套子shell

      (echo $BASH_SUBSHELL) ###查看当前子shell个数

      • 示例:

      (ls;echo $BASH_SUBSHELL)
      也可以嵌套执行:
      (ls(echo $BASH_SUBSHELL))
      (ls(pwd(echo $BASH_SUBSHELL)))

以上操作为并行多进程处理任务

二、Shell脚本变量

在Shell脚本编程中,变量用来存储和使用数据。按照其特性和用途,Shell变量主要可以分为以下几类:

  1. **环境变量:**这些变量对于Shell来说是有特殊意义的,它们影响Shell的行为以及运行的程序。环境变量可以被Shell的任何子进程继承。
  2. **位置变量:**这些变量由命令行参数提供,它们分别对应于脚本接收的参数。
  3. **局部变量:**在函数中定义的变量,只在该函数的作用域内有效。
  4. **全局变量:**在脚本中定义的变量,在整个脚本的作用域内有效。
  5. **特殊变量:**这些变量由Shell本身定义,有特殊的功能。

下面是一个整理成表格的变量类型详解:

变量类型 描述 示例 用途
环境变量 为程序的运行提供环境信息,被Shell及其子进程继承 export VAR="value" 设置环境参数,影响程序行为
位置变量 接收命令行输入的参数 $1, $2 获取脚本参数
局部变量 函数内部定义,仅在函数内部有效 local localVar="value" 函数内部使用,避免全局污染
全局变量 脚本范围内定义,整个脚本中有效 VAR="value" 跨函数使用变量
特殊变量 Shell内置,有特殊含义或功能 $$, $?, $! 执行控制、状态查询等

特殊变量举例说明:

  • $$:当前Shell进程ID(PID)
  • $?:最后命令的退出状态
  • $!:最后一个后台命令的进程ID
相关推荐
哲伦贼稳妥几秒前
一天认识一个硬件之服务器
运维·服务器·经验分享·硬件工程
baidu_3755288117 分钟前
ubuntu20.04/22.04/24.04 docker 容器安装方法
linux·c语言·c++·嵌入式硬件
顶点元21 分钟前
Linux TCP服务器和客户端学习
linux·tcp/ip
德迅云安全-小娜27 分钟前
服务器出现访问卡慢的原因有哪些
运维·服务器·网络
Flying_Fish_roe27 分钟前
linux-用户与权限管理-文件权限
linux·运维·服务器
Betty’s Sweet31 分钟前
[Linux]:动静态库
linux·动态库·静态库
公众号:ITIL之家31 分钟前
ITIL与DevOps的融合:打造敏捷IT服务管理
运维·devops
cooldream200937 分钟前
linux中2024新版virtuoso安装的详细步骤
运维·图数据库·virtuoso
DO your like1 小时前
MySQL8 windows archive 安装
服务器
双木的木2 小时前
数据分析1480 | 汇总17个工作必备的Python自动化代码(下)建议收藏!
运维·人工智能·python·sql·数据挖掘·数据分析·自动化