shell编程规范与变量

news/2024/10/17 16:23:22/

shell脚本编程规范

shell脚本概述

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

Shell脚本应用场景

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

在这里插入图片描述

  • 什么是Shell
    就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你在shell输入的打开音乐的命令,Shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者.

  • Shell(壳程序)
    是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命今) 并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

  • Linux中有哪些shell
    检查一下/etc/shells这个文件,里面就是Linux所包含的shell。
    最常用的就是bash、tcsh、csh、sh、nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本
    1 bash: 基准于GNU的框架下发展出的shell。
    2 csh: 语法有点类似于c语言的shell。
    3 tcsh: 整合了csh,提供更多的功能。
    4 sh: 已经被bash所替换
    5 nologin: 奇怪的shell,这个shell可以让用户无法登录主机
    : bash (/bin/bash) 是目前大多数 Linux 版本采用的默认 Shell。
    在这里插入图片描述

  • 拓展知识:
    1 为什么系统上合法的shell要写入/etc/shells这个文件呢?
    这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件
    2 用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
    当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内

shell脚本的作用

  • 自动化运维
  • 批量化重复操作可以编写脚本结合计划任务自动周期运行
  • 减轻管理员工作量
  • 提高处理文本文件的速度
  • 避免配置出错

shell是一个面向字符串的编程语言,可以跟python之类的其他语言配合起来,比如某个复杂的功能使用一个Python脚本来实现,然后在shell中调用这个脚本实现较复杂的功能;或者反过来,在Python脚本中调用外部的Shell脚本来提高自动化的效率,也是可以的。

计算机编程语言
面向对象java ,python,C++,C#,Go
面向过程C语言,shell
强类型语言JAVA , C ,C++ ,C# , GO
弱类型语言python, Shell , PHP
编译型语言,执行前需要先编译,运行速度快JAVA , C ,C++ ,C# , GO
解释性语言,不需要编译即可直接执行,常用于作脚本python, Shell , PHP

编写shell脚本的规范

  • 1)脚本声明 若第一行为"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
  • 2)注释信息 行首以#号开头定义注释信息,被注释的行内容将不会被执行
  • 3)可执行语句 编写要执行的脚本代码;比如echo命令,用于输出""之间的字符串

在这里插入图片描述

运行shell脚本

  • 1)用绝对路径或者相对路径指定脚本文件运行,需要执行用户拥有执行权限x,脚本会在子shell环境中运行(不会影响当前所在目录、变量的值 等因素)
  • 2)用 bash或者sh 程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行(不会影响当前所在目录、变量的值 等因素)
  • 3)用 source或者. 号指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值 等因素)
    在这里插入图片描述

在这里插入图片描述

重定向与管道操作

交互式硬件设备

  • 标准输入: 从该设备接收用户输入的数据
  • 标准输出: 通过该设备向用户输出数据
  • 标准错误: 通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据,而不是键盘输入
重定向输出>将输出结果保存到指定的文件 (覆盖原有内容)
重定向输出>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件 (覆盖原有内容
标准错误输出2>>将错误信息追加到指定的文件中
混合输出&>将标准输出、标准错误的内容保存到同一个文件中
混合输出2>&1将标准错误输出重定向到标准输出
  • 重定向输入和重定向输出
    在这里插入图片描述
    在这里插入图片描述- 标准错误输出

在这里插入图片描述

  • 混合输出
    在这里插入图片描述
    ls -lh xlog.txt 2>&1等同于ls -lh &> log.txt
    本来1–>屏幕(1指向屏幕)
    执行>log.txt后,1–>log.txt (1指向loq.txt)
    执行2>&1后,2–>1 (2指向1,而1指向log.txt,因此2也指向了log.txt)

管道符号“|”

将左侧命令输出的结果,作为右侧命令的处理对象
注意,有的右侧命令不能处理左侧的输出结果,这里要在“|”后面加上xargs
示例:find /opt -name “*.txt” | xargs ls -lh
在这里插入图片描述

shell脚本变量

  • 变量的作用
    用来存放系统和用户需要使用的特定参数(值)
    变量名:使用固定的名称,由系统预设或用户定义
    变量值: 能够根据用户设置、系统环境的变化而变化
  • 变量的类型
    自定义变量:由用户自己定义、修改和使用
    特殊变量: 环境变量,只读变量,位置变量,预定义变量

定义一个新的变量

  • 定义一个新的变量
    变量名必须以字母下划线开头,区分大小写,建议全大写
变量名=变量值
  • 查看变量的值
echo $变量名

在这里插入图片描述
通常来说,建议平时就一直加上“”号,省的到时候报错
在这里插入图片描述

赋值时使用引号

  • 双引号": 允许通过$符号引用其他变量值
  • 单引号 ': 禁止引用其他变量值,$视为普通字符
  • 反撇号`: 命令替换,提取命令执行后的输出结果(反撇号在键盘左上位置,在tab键上面)相当于$()

在这里插入图片描述在这里插入图片描述

  • 从键盘输入内容为变量赋值
    read [-p“提示信息”] 变量名
    vim second.sh
    在这里插入图片描述
    在这里插入图片描述

设置变量的作用范围

export 变量名-----临时有效,重启失效

在这里插入图片描述

  • 永久生效
vim /etc/profile

在这里插入图片描述

整数变量的运算

  • 1 expr 变量1 运算符 变量2 [运算符] [变量3]

常用运算符

常用运算符
加法运算+
减法运算-
乘法运算\ *
除法运算/
求模 (取余) 运算%

在这里插入图片描述
在这里插入图片描述

  • 2 echo $(( ))-----括号里面可以加空格也可不加

在这里插入图片描述

  • 3 echo $[ ] -----中括号里面可以加空格也可不加

在这里插入图片描述

  • 4 let 设置一个变量,然后echo输出
let i=10*3
echo  $i

在这里插入图片描述
拓展

在这里插入图片描述

特殊的ShelI变量

  • 环境变量
    由系统提前创建,用来设置用户的工作环境
    配置文件: /etc/profile、~/.bash_profile
  • 常见的环境变量
    PWD、PATH
    USER 、SHELL、HOME

在这里插入图片描述

如何把命令加入到环境变量中

  • 方法一:复制命令文件内容到环境变量的配置文件目录中
  • 方法二:将命令文件所在的目录加入到环境变量配置目录
vim /etc/profile

在这里插入图片描述
在这里插入图片描述

设置只读变量(用于变量值不允许被修改的情况,包括删除或取消,想删除重启)

readonly 变量名

在这里插入图片描述

位置变量

表示为$n,脚本后面都是位置变量
在这里插入图片描述

vim /root/forth.sh

在这里插入图片描述
在这里插入图片描述

预定义变量

$ * 、$ @: 表示命令或脚本要处理的参数。
$ * :把所有参数着成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4。
$ @: 把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1”“$2””“$3"”$4”。

有双引号
在这里插入图片描述

在这里插入图片描述
没有双引号
在这里插入图片描述

在这里插入图片描述

$0: 表示当前执行的脚本或命令的名称。
$#: 表示命今或脚本要处理的参数的个数。
在这里插入图片描述
在这里插入图片描述

$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。
在这里插入图片描述


http://www.ppmy.cn/news/51164.html

相关文章

logback日志框架集成方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、logback是什么&#xff1f;二、使用步骤1.使用方式控制台输出配置文件输出配置html输出配置定期删除配置方式 总结 前言 提示&#xff1a;这里可以添加本文…

【C++】右值引用(极详细版)

在讲右值引用之前&#xff0c;我们要了解什么是右值&#xff1f;那提到右值&#xff0c;就会想到左值&#xff0c;那左值又是什么呢&#xff1f; 我们接下来一起学习&#xff01; 目录 1.左值引用和右值引用 1.左值和右值的概念 2.左值引用和右值引用的概念 2.左值引用和右…

达梦数据迁移问题罗列

目录 一、前言 二、问题罗列 一、前言 最近小编接触到国产的数据库达梦数据库&#xff0c;然后在用达梦数据迁移工具MySQL迁移至达梦的时候遇到了一系列的问题现在罗列一下在这里。目前关于国产的数据库达梦这些资料比较少&#xff0c;希望能够帮到有需要的同志们&#xff01…

Java面试题面向对象部分

面向对象 面向对象概述 面向对象和面向过程的区别 面向过程&#xff1a; 优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如单片机、嵌入式 开发、Linux/Unix等一般采用面向过程开发&#xf…

Hibernate的持久化类

Hibernate是一个开源的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;用于将Java程序中的对象映射到数据库中的关系型数据。在Hibernate中&#xff0c;持久化类是用来映射Java对象和关系型数据库表的类。 编写Hibernate持久化类需要遵循以下规则&#xff1a; 持久…

MATLAB离散时间信号的实现和时域基本运算(九)

1、实验目的&#xff1a; 1&#xff09;了解时域离散信号的特点&#xff1b; 2&#xff09;掌握MATLAB在时域内产生常用离散时间信号的方法&#xff1b; 3&#xff09;熟悉离散时间信号的时域基本运算&#xff1b; 4&#xff09;掌握离散时间信号的绘图命令。 2、实验内容&…

学系统集成项目管理工程师(中项)系列03_职业道德规范

1. 职业道德 1.1. 涵盖了从业人员与服务对象、职业与职工、职业与职业之间的关系 1.2. 是所有从业人员在职业活动中应该遵循的行为准则 1.3. 包括爱岗敬业、诚实守信、办事公道、服务群众和奉献社会 2. 道德 2.1. 通常与法律相对应&#xff0c;具有非强制性 2.2. 指人们依…

windows下网络聊天室项目(C++、SQLite、计算机网络)——思路+源码+解析

这里只是在windows系统下用C++做的简易聊天室,其界面比较low,不过该有的功能已基本实现。至于带界面的,QT里有封装好的QTcpSocket套接字,会在下一篇博客里予以介绍。主要的功能主要包含的功能有:查看当前在线人数、进入群聊界面、进入私聊界面、查看聊天记录、文件传输、更…