当前位置: 首页 > news >正文

Shell脚本的编程规范和变量类型

一. 了解编程

1.程序编程风格

面向过程语言

开发的时候  需要一步一步执行    

  • 问题规模小,可以步骤化,按部就班处理

  • 以指令为中心,数据服务于指令

  • C,shell

面向对象语言

开发的时候 将任务当成一个整体

  • 将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。

  • 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合

  • 对象是类的具象,是一个实体

  • 问题规模大,复杂系统

  • 以数据为中心,指令服务于数据

  • java,python,golang  等 

2. 处理逻辑

顺序执行:程序按从上到下顺序执行

选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)

二 .Shell脚本的编程概述

1.shell脚本简介

1.1 基本概念

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈个用户,这种对话方式可是交互也可是非交互的,我们所输入的命令计算机是不是别的,这是就需要一种程序来帮助我们进行翻译,编号才能计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
 

1.2 应用场景

  • 重复性操作

  • 交互性任务

  • 批量事务处理

  • 服务运行状态监控

  • 定时任务执行

1.3 作用

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

1.4 linux中有哪些shell

查看本机shell种类

解释

- sh:已经被bash替换
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

2.shell 脚本的编写规范和执行方法

 2.1 构成

  1. 解释器  脚本是用什么语言写的
  2. 注释    解释语句的含义
  3. 执行语句   
脚本申明(解释器) :若第一行为“!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,
比如 #!/usr/bin/python.  #!/usr/bin/expect.注释信息:以“#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。可执行语句:比如echo命令,用于输出""之间的字符串

2.2 如何执行

  1. 使用路径执行    需要加执行权限
  2. 直接使用解释器    不需要权限
  3. source 和 .  执行   不需要执行权限

#法一:指定路径的命令,要求文件必须有x权限
[root@localhost ~]#chmod +x /test/first.sh 
[root@localhost ~]#/test/first.sh#法二:指定Shell来解释脚本,不要求文件必须有x权限。
[root@localhost ~]#bash first.sh #法三:source 脚本路径执行shell脚本
[root@localhost ~]#source first.sh 
[root@localhost ~]#. first.sh 

使用前两种方式执行脚本会开启子bash 环境去执行脚本

使用source 和 . 会影响当前的bash环境  不推荐使用

前两种使用的子shell 不影响当前环境

2.3 脚本文件命名要求

区分大小写不能使程序中的保留字和内置变量:如: if, for, hostname只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“-",和主机名相反不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH驼峰StudentFirstName小驼峰studentFirstName·下划线: student_name

2.4 脚本错误

1.命令错误:命令出错不会影响下面的操作,下面的命令继续2.语法错误:会影响接下来的命令继续3.逻辑错误:只能自己去筛查查找代码的正确:bash -n 脚本名称 (不在当前目录下加绝对路径)   检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径)   检查逻辑错误

命令出错,不影响下面的操作

语法错误,下面的操作不继续

查找代码是否正确:

总结:

  1. 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的

  2. 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察

  3. 逻辑错误:只能使用 bash -x 进行

2.5 出错解决

2.5.1 set  -e 

在脚本前面输入 set  -e  一旦出错立即停止

2.5.2 set  -u 

变量不存在就不让执行

三.重定向与管道操作

1.重定向

1.1 交互式硬件设备

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

1.2 重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

实操:

① 将123 重定向输出到 mima.txt 文件中,然后将 mima.txt 的内容重定向输入给用户 zhangsan 的密码,从mima.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux(setenforce 0)

②  覆盖 > 和追加 >>

③ 输出错误信息

④ 混合输出

  • 1>&2 把标准输出重定向到标准错误
  • 2>&1 把标准错误重定向到标准输出

把标准输出,重定向到错误输出里面

把错误输出重定向到标准输出里面

2.多行重定向

        可以帮助脚本开发人员不必使用临时文件来构建输入信息, 而是直接就地生产出一个文件并用作命令的标准输入。

EOF 也可以用其它字母,只要求一样就可以

3.管道

管道操作符:“|”   将管道符号“|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道.

四. Shell脚本变量

1 shell 变量的作用

用来存放系统和用户需要使用的特定参数(值)变量名:使用固定的名称,由系统预设或用户定义变量值:能够根据用户设置、系统环境的变化而变化

2. shell 变量的类型

  • 自定义变量:由用户自己定义、修改和使用;

  • 特殊变量:环境变量,只读变量,位置变量,预定义变量

2.1 自定义变量

① 定义新的变量

格式:变量名=变量值

② 查看定义的变量的值

格式:echo  $变量名

③ 取消变量

格式:echo  变量名

④ 追加变量

 格式:变量名+=追加值

 临时添加变量

永久添加需要写入 /etc/profile

2.2 特殊符号

双引号  弱引用   可以识别变量
单引号 强引用   不能识别变量
{  }      定义变量名的范围
`` 反撇    调用命令的执行结果与 $() 功能一样

2.3 变量的命名要求

  • 区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname ,test

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

2.4 read  -p

交互式的输入变量值,然后使用变量

2.5 export  变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

格式:

export  变量名

export  变量名=变量值

这时候我们需要用到 export ,将局部变量变成全局变量

 方式一

方式二:

2.6 expr 整数变量的运算

运算符: + 加法 、 - 减法 、 \* 乘法 、 / 除法 、 % 取余 

常见的表达式:

(1)expr 变量1  运算符  变量2(2) let var=算术表达式(3) ((var=算术表达式)) (4) var= $[算术表达式](5) var= `expr 算术表达式 `(6) echo '算术表达式' | bc

这些操作都是一个意思的不同表达方式:

2.7 随机数生成器

random 随机数  取值范围:0~32767

制作一个学号点名器

假如班上有50名学生

2.8 颜色生成

echo  -e  启用下列反斜杠转义的解释

随机生成颜色

2.9 提取系统信息脚本

#! /bin/bashhost=`ifconfig ens33|grep netmask|tr -s " "|cut -d" " -f3`
name=`hostname`
cpu=`lscpu|grep 型号名称|tr -s " "|cut -d" " -f2-8`
k=`uname -r`
os=`cat /etc/redhat-release`
disk=`lsblk|grep disk|tr -s " "|cut -d" " -f4`
mem=`free -h|grep Mem|awk '{print $2}'`echo -e "\E[1;35m------------------------system  info -------------------------\E[0m"echo    "主机名:      $name"
echo    "ip地址:      $host"
echo    "cpu型号:     $cpu"
echo    "内核版本:    $k"
echo    "系统类型:    $os"
echo    "磁盘大小:    $disk"
echo    "内存大小:    $mem"echo -e "\E[1;35m-----------------------  end   ------------------------------\E[0m"

3. 特殊的shell变量

3.1 环境变量

  1. 由系统提前创建,用来设置用户的工作环境

  2. 可以使用env查看环境变量

$USER  表示用户名称

$HOME 表示用户的宿主目录

$LANG  表示语言和字符集

$PWD   表示当前所在工作目录

$PATH  表示可执行用户程序的默认路径

配置文件:

/etc/profile(全局生效)作用于所有用户

~/.bash_profile(当前用户环境)用户独立的配置文件,修改这个文件只作用于当前用户,可以用来长期变更或设置环境变量
 

给PATH可执行程序的默认搜索路径里面添加一个路径

将自建路径添加到默认可执行程序里面,并且给他赋于执行权限,这样不再需要输入绝对路径了

3.2 只读变量

readonly 命令用于定义只读shell变量和shell函数,readonly命令的选项-p可以输出显示系统中所有定义的只读变量。

重启 shell 环境可以取消

3.3 位置变量

  • 当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。

  • $n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}

10以上需要加 { }

3.4 预定义变量

$*表示所有位置参数的内容看成一个整体返回    返回所有
$@表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#表示命令行中位置参数的总个数
$$当前bash的进程id
$!后台任务最后一个id
$0表示当前执行的脚本或程序的名称 当前脚本的名字

$?  表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

$0  表示当前执行的脚本或程序的名称 当前脚本的名字

$$ 当前bash的进程id

$#  表示命令行中位置参数的总个数

区别:$*和$@

$*  1-26  当成一个整体

$@  1-26  $1-$26独立的个体

相关文章:

Shell脚本的编程规范和变量类型

一. 了解编程 1.程序编程风格 面向过程语言 开发的时候 需要一步一步执行 问题规模小&#xff0c;可以步骤化&#xff0c;按部就班处理 以指令为中心&#xff0c;数据服务于指令 C&#xff0c;shell 面向对象语言 开发的时候 将任务当成一个整体 将编程看成是一个…...

C++面试:跳表

目录 跳表介绍 跳表的特点&#xff1a; 跳表的应用场景&#xff1a; C 代码示例&#xff1a; 跳表的特性 跳表示例 总结 跳表&#xff08;Skip List&#xff09;是一种支持快速搜索、插入和删除的数据结构&#xff0c;具有相对简单的实现和较高的查询性能。下面是跳表…...

掌握C++20的革命性特性:Concepts

掌握C20的革命性特性&#xff1a;Concepts C20 的新特性 C20 引入了 Concepts&#xff0c;这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词&#xff0c;用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编…...

win11开机后频繁刷新桌面,任务栏不显示,文件资源管理器explorer报错ntdll.dll

win11 开机后桌面频繁刷新&#xff0c;cpu 暴涨&#xff0c;任务栏不出现。 不知道是安装了什么软件还是系统升级造成的&#xff0c;好长时间不重启电脑了&#xff0c;然后重启了下电脑。 结果就是&#xff1a; 现象描述 重启后 输入密码进入后 变得巨慢。好久才进入的桌面。…...

解决Git添加.gitignore文件后不生效的问题

1. 问题描述 如上图所示&#xff0c;在已存在.gitignore文件且已经提交过的Git管理的项目中&#xff0c;其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了&#xff0c;可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…...

Shell Linux学习笔记

注意&#xff1a;该文章摘抄之百度&#xff0c;仅当做学习笔记供小白使用&#xff0c;若侵权请联系删除&#xff01; 目录 什么是shell ? Linux正则匹配 grep tar与unzip echo history 重定向 shell 单双引号 位置参数 预定义变量 运算 正则表达式 字符截取命令 …...

kingbase常用SQL总结之锁等待信息

锁信息与等待事件 分析kingbase&#xff08;pg&#xff09;数据库锁等待、死锁时需要我们准确的定位等锁或者死锁相关的事务。关于获取锁等待信息或者死锁信息已有经典的SQL可以直接使用&#xff0c;但是需要我们先了解sql语句获取的每个字段的意义。 获取到锁等待事务不能完全…...

「优选算法刷题」:长度最小的子数组

一、题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输…...

RuoYi-Cloud本地部署--详细教程

文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…...

如何优雅的发布一个 TypeScript 软件包?

向 NPM 发布软件包本身并不是一个特别困难的挑战。但是&#xff0c;配置你的 TypeScript 项目以取得成功可能是一个挑战。你的软件包能在大多数项目上运行吗&#xff1f;用户能否使用类型提示和自动完成功能&#xff1f;它能与 ES Modules (ESM) 和 CommonJS (CJS) 风格的导入一…...

总结的太到位:python 多线程系列详解

前言&#xff1a; 上vip课的时候每次讲到框架的执行&#xff0c;就会有好学的同学问用多线程怎么执行&#xff0c;然后我每次都会说在测开课程会详细讲解&#xff0c;这并不是套路&#xff0c;因为如果你不理解多线程&#xff0c;不清楚什么时候该用什么时候不该用&#xff0c;…...

惬意上手Python —— 装饰器和内置函数

1. Python装饰器 Python中的装饰器是一种特殊类型的函数&#xff0c;它允许用户在不修改原函数代码的情况下&#xff0c;增加或修改函数的行为。 具体来说,装饰器的工作原理基于Python的函数也是对象这一事实&#xff0c;可以被赋值给变量、作为参数传递给其他函数或者作为其他…...

python 调用dll

在Python中&#xff0c;可以使用ctypes库来调用DLL文件。ctypes库是一个标准库&#xff0c;用于在Python中加载共享库&#xff08;例如DLL文件&#xff09;并调用其中的函数。 以下是一个简单的示例&#xff0c;演示如何使用ctypes库调用DLL文件中的函数&#xff1a; import c…...

docker里Java服务执行ping命令模拟流式输出

文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户&#xff0c;一直使用CS版本的信控平台&#xff0c;直接安装客户Windows server服务器上&#xff0c;主要对信号机设备进行在线管理、方案配时…...

代码随想录算法训练营第十三天| 239. 滑动窗口最大值 、347.前 K 个高频元素

239. 滑动窗口最大值 思路&#xff1a; 用遍历区间的元素时&#xff0c;维护一个单调队列&#xff0c;从大到小排列。 要找到最大值&#xff0c;实际单调队列保存区间内最大值及最大值右侧的第二大值&#xff08;用于当前最大值处于区间左端&#xff0c;在区间右移时更新临时最…...

旋转花键的使用寿命与机械原理分析

旋转花键是一种传动部件&#xff0c;广泛应用于各种机械设备中。对于厂商来说&#xff0c;如何保证使用寿命是重中之重&#xff0c;而旋转花键的使用寿命与其机械原理密切相关&#xff0c;了解其机械原理有助于更好地维护和使用旋转花键&#xff0c;从而提高其使用寿命。 旋转花…...

互联网摸鱼日报(2024-01-22)

互联网摸鱼日报(2024-01-22) 开源中国资讯 Stability AI 推出更小、更高效的 1.6B 语言模型 X 正面向 Android 推出音频和视频通话 Extism —— WebAssembly 插件实现框架 Gitee 推荐 | 龙蜥社区最佳安全加固实践指南 security-benchmark 每日一博 | 得物云原生容器技术探…...

CentOS 7 安装配置MySQL

目录 一、安装MySQL​编辑​编辑 1、检查MySQL是否安装及版本信息​编辑 2、卸载 2.1 rpm格式安装的mysql卸载方式 2.2 二进制包格式安装的mysql卸载 3、安装 二、配置MySQL 1、修改MySQL临时密码 2、允许远程访问 2.1 修改MySQL允许任何人连接 2.2 防火墙的问题 2…...

Gold-YOLO(NeurIPS 2023)论文与代码解析

paper&#xff1a;Gold-YOLO: Efficient Object Detector via Gather-and-Distribute Mechanism official implementation&#xff1a;https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO 存在的问题 在过去几年里&#xff0c;YOLO系列已经…...

多个coco数据标注文件合并

一、coco数据集是什么&#xff1f; COCO&#xff08;Common Objects in Context&#xff09;是一个用于目标检测和图像分割任务的标注格式。如果你有多个COCO格式的JSON文件&#xff0c;你可能需要将它们合并成一个文件&#xff0c;以便更方便地处理和管理数据。在这篇博客中&…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...