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,提供基本的命令行界面和执行功能。
BashBourne Shell的扩展,提供了更多的功能和特性,如数组和循环。
C Shell (csh)基于Bourne Shell,增加了类C语言的语法和功能。
Korn Shell (ksh)结合了Bourne Shell和C Shell的特点,提供了脚本编程的增强特性。
Z Shell (zsh)功能强大的Shell环境,提供了自动补全、语法高亮等特性。
TcshC Shell的扩展,增加了命令历史和补全功能。
DashDebian 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值