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

news2024/11/24 9:12:35

一. 了解编程

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/bash

host=`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独立的个体

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

《小学生作文辅导》期刊投稿邮箱

《小学生作文辅导》是国家新闻出版总署批准的正规教育类期刊&#xff0c;适用于全国各小学语文老师事业单位及个人&#xff0c;具有原创性的学术理论、工作实践、科研成果和科研课题及相关领域等人员评高级职称时的论文发表&#xff08;单位有特殊要求除外&#xff09;。 栏目…

RTDETR 引入 超越自注意力:面向医学图像分割的可变形大卷积核注意力

医学图像分割在转换器模型的应用下取得了显著的进展,这些模型擅长捕捉广泛的上下文和全局背景信息。然而,这些模型随着标记数量的平方成比例增长的计算需求限制了它们的深度和分辨率能力。大多数当前的方法通过逐层处理D体积图像数据(称为伪3D),在处理过程中错过了关键的跨…

alfred自定义谷歌翻译workflow

如果要实现自定义workflow&#xff0c;则必须安装付费版的alfred&#xff0c;囊中羞涩的话可以自行淘宝。自定义步骤如下&#xff1a; 1. 新建空的workflow&#xff0c;填写基本信息 2. 开发python脚本 打开该workflow所在目录&#xff0c;进行下面步骤&#xff1a; 首先安装…

【GitHub项目推荐--开源2D 游戏引擎】【转载】

microStudio 是一个可在浏览器中运行的游戏引擎&#xff0c;它拥有一套精美、设计精良、全面的工具&#xff0c;可以非常轻松地帮助你创建 2D 游戏。 你可以在浏览器中访问 microStudio.dev 开始搭建你的游戏&#xff0c;当然你可以克隆现有项目或创建新游戏并开始编码&#x…

城市需求显示在地图上(附MATLAB程序)

我们显示很多城市信息时, 有时候需要把各地人口数量, 各地城市对某种货物的需求量呈现到地图上, 可以用以下代码实现: 程序结果: % 画中国地图 clc;close all;clear all; %%曲面拟合 warning off;%禁止显示警告信息 % load lonlatdata.mat; lonlatdataxlsread(工作簿1.xls,D2…

对于超低延迟SSD,IO调度器已经过时了吗?-part1

此前针对linux IO栈与IO调度器&#xff0c;小编有过基本原理的分析&#xff0c;前文阅读请参考&#xff1a; 《存储IO路径》专题&#xff1a;四种IO栈全能大比武 《存储IO路径》专题&#xff1a;不同IO调度器的差异 近期&#xff0c;小编看到一篇来自University of Louisvil…

Python基础之文件操作(I/O)

和其他编程语言一样&#xff0c;Python 也具有操作文件&#xff08;I/O&#xff09;的能力&#xff0c;比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。合理应用python提供的文件操作基本函数&#xff0c;可大大提高自动化实现的效率与框架代码的稳定性…

luffy商城项目(二)

路飞后端配置 二次封装response drf提供的Response对象&#xff0c;不能很方便的加入code和msg字段&#xff0c;自己封装一个Response类&#xff0c;以后都用我们自己封装的&#xff0c;方便咱们写code和msg 封装步骤&#xff1a; 1 在utils/common_response.py from rest_…

基于leaflet地图实现点击点位图标,在图标边上展示信息弹窗的方案

文章标题很直观明显了&#xff0c;所以正文就直入主题。 leaflet组件其实很友好了&#xff0c;基本上能解决大部分网页端地图的大部分常用需求。 现在&#xff0c;要实现点击点位图标&#xff0c;在图标边上展示信息弹窗这个需求。提供两个思路&#xff1a; 1. 利用leaflet自…

v38.Switch语句

1.Switch语句可以替代if-else语句 2.具体使用 Switch&#xff08;expression&#xff09; &#xff5b; case label&#xff1a;...... &#xff5d; ①将x与case后的label 进行比较&#xff1b; ②注意后面有冒号&#xff1b; ③从上往下开始检查case&#xff1b; ④如果…

011 变量

变量的定义 注意事项 作用域 类变量&#xff1a;定义在类中的变量&#xff0c;类的整个生命周期内可用实例变量&#xff1a;定义在类中的变量&#xff0c;类的实例可以使用局部变量&#xff1a;定义在方法中的变量&#xff0c;仅在方法内可以使用 class Dog{// 类变量static …

数据采集与预处理02 :网络爬虫实战

数据采集与预处理02 &#xff1a;网络爬虫实战 爬虫基本知识 1 HTTP的理解 URL uniform resource locator. 是统一资源定位符&#xff0c;URI identifier是统一资源标识符。几乎所有的URI都是URL。 URL前部一般可以看到是HTTP还是HTTPS&#xff0c; 这是访问资源需要的协议…

HelloWorld(java)

1.切换盘符&#xff1a;找到刚刚书写的代码 2.编译&#xff1a;javac是JDK提供的编译工具&#xff0c;通过这个工具&#xff0c;把当前路径下下的HelloWorld.java文件编译成class文件 3.运行&#xff1a;java也是JDK提供的一个工具&#xff0c;作用就是用来运行代码&#xff…

2024.1.23 寒假训练记录(6)

记录一个训练赛踩的大坑&#xff1a;往函数里传vector一定要加引用&#xff01;犯了三次的错误还是记不住&#xff0c;服了&#xff0c;一道题调了一个小时。 文章目录 CF 1490E Accidental VictoryCF 1753B Factorial DivisibilityCF 1454E Number of Simple PathsAT ARC148A …

ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>=5.12

一、错误描述 ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>5.12 在用python中的plt包进行绘图时对plt进行了更新&#xff0c;更新之后再运行以前的代码就出现了这个问题。 二、bug消除 &#xff08;一&#xff09;解决方法——升级pyqt包…

Java面试题之基础篇

文章目录 一&#xff1a;谈谈你对面向对象的理解二&#xff1a;JDK、JRE、JVM三者区别和联系三&#xff1a;和equals比较四&#xff1a;hashCode与equals五&#xff1a;final六&#xff1a;String、StringBuffer、StringBuilder七&#xff1a;重载与重写的区别&#xff1f;八&a…

【云原生】认识docker容器操作命令

目录 一、容器操作命令 1、创建容器 2、删除容器以及停止容器运行 3、查看容器的运行状态 4、查看容器的详细信息 5、将容器的文件传输到宿主机以及将宿主机的文件传输到容器中 6、批量删除容器 7、进入容器 二、容器的迁移 1、先在容器中创建测试文件 2、将容器存储…

永磁同步电机矢量控制原理

永磁同步电机数学模型 永磁同步电机的磁场定向控制

宝塔面板部署MySQL并结合内网穿透实现公网远程访问本地数据库

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…