首页 > 系统相关 >Shell脚本基础、组成结构、调试、运算符

Shell脚本基础、组成结构、调试、运算符

时间:2024-09-10 13:24:48浏览次数:11  
标签:脚本 Shell expr 运算符 命令 bash 执行 调试

思维导图:

一、脚本基础

1、shell编程介绍与特性

        Shell是种命令解释程序,也可以看作是一种命令语言的解释器。用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行。Shell所使用的这种命令语言称为Shell语言。Shell语言不仅仅是一种交互式语言,它还是一种可编程的程序设计语言

        将若干个Shell命令行写入个文件就构成了一个Shell程序,它可以被Shell逐条地解释执行。用Shell语言编写的Shell程序可以使用各种变量、参数和控制结构来组织命令流程,自动化地完成各种复杂冗繁的处理工作。

        Linux系统中广泛使用了Shell程序来实现系统的初启、配置、管理和维护等工作。因此,熟练掌握Shell语言可以更加深入地理解系统的运行机制,更加有效地使用和管理系统。

2、Shell语言的特点

与其他编程语言相比,Shell语言具有如下特点:

  • Shell是一种解释性语言。这就是说,用Shell语言写的程序不需编译,可以直接由Shell进程解释执行。解释性语言的特点是快捷方便,可以即编即用,但与编译性语言的目标程序来比,解释性语言程序的运行速度要低一些。
  • Shell是基于字符串的语言。Shell只是做字符串处理,不支持复杂的数据结构和运算,Shell的输出也全部是字符方式的。
  • Shell是命令级语言。Shell程序全部由命令而不是语句组成,几乎所有的Shell命令和可执行程序都可用来编写Shell程序。
  • Shell命令十分丰富,命令的组合功能也十分强大。所以,用简单的命令和命令组合形成的Shell程序即简洁又高效,可以实现各种复杂的功能。

另外需要说明的是,不同版本的Shell程序不完全兼容,差别可能是细微的,也可能是明显的。

        Shell程序也称Shell脚本,是由一系列Shell命令为基本元素构成的文本文件。简单的Shell程序可以只是一个命令序列,高级Shell程序中还可以包含复杂的命令组合,定义各种参数和变量、使用条件命令、控制结构以及其他高级特性。

3、变量
(1)什么是变量

        顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址

        在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。

(2)变量的命名

        在shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,shell并没有做出明确的规定。

        因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。

        在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。

(3)变量的类型

整形         int        age=10

浮点型     float     salary=3.1

字符型     在shell中,加了引号的字符就是字符串类型  单引号  双引号  也可以不用引号

msg=“hello cy”

注意:字符串包含空格必须加引号

boolean布尔型:

它只能是True或False  就是真假是非

连续字符不加引号包含也是可以的,但是我们还是强烈建议加上引号,规范一些。

单引号和双引号的意义是不同的

双引号 “ ”  弱引用  引号的特殊字符有意义

单引号 ‘  ’  强引用  引号内所有特殊字符都取消意义

[root@server ~]# name="cy"

[root@server ~]# echo "${name} is good"

cy is good

[root@server ~]# echo '${name} is good'

${name} is good
4、脚本执行方式

(1)使用绝对路径执行

(2)使用相对路径执行。语法格式:./a.sh

(3)使用sh或bash命令来执行。

语法格式:

sh a.sh 不需要执行权限

(4)使用.(空格)脚本名称来执行

语法格式:

.  a.sh   不需要执行权限,注意的是.后面有空格

(5)使用source来执行

语法格式:

source  a.sh 不需要执行权限(主要用于生效配置文件)

5、shebang机制

        Shebang(也被称为 hashbang 或者 pound-bang)是一个由井号 # 和感叹号 ! 组成的字符序列,通常出现在脚本文件的第一行。Shebang 机制在类 Unix 操作系统中用来告诉操作系统应该使用哪个解释器来执行该脚本文件。

#!/bin/bash

这行代码告诉操作系统使用 /bin/bash 路径下的 Bash shell 来执行当前脚本。这是运行 Bash 脚本的标准 Shebang。

#!/usr/bin/python

这行代码指示操作系统使用 /usr/bin/python 路径下的 Python 解释器来执行脚本。这通常用于运行 Python 2.x 脚本。

#!/usr/bin/perl

这行代码告诉操作系统使用 /usr/bin/perl 路径下的 Perl 解释器来执行脚本。这是运行 Perl 脚本的标准 Shebang。

二、脚本的组成结构

1、脚本的组成

(1)开头:#!/bin/bash  其中符号#!是用来告诉系统我们是用什么解析器来执行的

(2)注释:以#开头行表示注释

(3)命令行的书写规则:一行为一条命令,一行多条命令时需用 ; 分割,分割长命令可以使用反斜杠 \

2、程序返回值

程序执行以后有两类返回值:

(1)程序执行的结果

(2)程序状态返回代码(0-255)

          0:正确执行

          1-255:错误执行

三、shell脚本调试

1、脚本执行的过程解析

        当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile当前用户家目录下的.bash_profile当前用户家目录下的.bashrc/etc/bashrc等),在加载了上述环境变量文件后,Shell就开始执行Shell脚本中的内容。

        Shell脚本是从上至下、从左至右依次执行每一行的命令及语句的,即执行完了一个命令后再执行下一个,如果在Shell脚本中遇到子脚本(即脚本嵌套)时,就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。

2、脚本执行的原理

        Shell在解释命令的时候并不是自己亲自执行,而是派生子进程让子进程去完成这项工作,这样的好处是把风险交给别人,当指令的执行出现问题时不会影响到shell(影响到其他指令的执行)。shell不可以挂,shell一旦挂就没有什么可以解释命令了。对我们而言shell为了保证自己风险最低,通过创建子进程进行命令行的解释工作,而shell自己只要去等就可以了。

3、写脚本注意事项

(1)开头加解释器:#!/bin/bash

(2)语法缩进,使用四个空格;多加注释说明

(3)命名建议规则:变量名大写,局部变量小写,函数名小写,名字体现出实际作用

(4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域

(5)有两个命令能帮助调试脚本:set -e 遇到执行非0时退出脚本  set -x 打印执行过程

(6)写脚本一定要先测试再到生产上

(7)脚本中的命令一定要用绝对路径

(8)引用命令是需要用 ` ` 符号

4、脚本调试方法
  • bash  -n  脚本名   检查脚本是否有语法错误
  • bash  -x  脚本名   单步执行,检查脚本错在哪里
  • [[:alpha:]]  代表任意大小写字母
  • [[:digit:]]   代表任意整数
5、案例:

(1)创建目录/tmp/hyh

(2)切换到/tmp/hyh目录

(3)创建目录a1b  b2c  6cy

(4)创建空文件 xy  x123y  123

(5)列出当前目录下以a或者6开头的文件或目录,将这些文件或目录导入到/tmp/file1文件中

(6)列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file2文件中

[root@node1 ~]# cat aa.sh 
#!/bin/bash
mkdir /tmp/hyh
cd /tmp/hyh
mkdir a1b b2c 6cz
touch xy x12y 123

[root@node1 hyh]# ls | egrep ^'a|b'
a1b
b2c
[root@node1 hyh]# ls | egrep ^[[:alpha:]][[:digit:]]
a1b
b2c
x12y
[root@node1 hyh]#

四、运算符

原生的bash并不支持简单的数学运算,通常要通过其他命令来实现

1、算术运算符

a和b都是变量

加法   expr  $a + $b

减法   expr  $a - $b

乘法   expr  $a \* $b

除法   expr  $b / $a

取余   expr  $b % $a

赋值   a=$b

相等  [ $a == $b ]

不相等  [ $a != $b ]

2、示例

#!/bin/bash

a=10

b=20

val=`expr $a + $b`

echo "a + b : $val"

A=3

B=6

let C=$A+$B    //let算术运算表达式

C=$[ $A+$B ]    //$[算术运算表达式]

C=$(( $A+$B ))    //$((算术运算表达式))

C=`expr $A + $B`   //expr  算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

3、例题:

写一个脚本,传递两个整数给此脚本,让脚本分别计算并显示这两个整数之和,差,积,商

[root@node1 ~]# cat a.sh 
#!/bin/bash
a=$1
b=$2
c=`expr $a + $b`
d=`expr $a - $b`
e=`expr $a \* $b`
f=`expr $a / $b`
echo $a+$b=$c
echo $a-$b=$d
echo $a\*$b=$e
echo $a/$b=$f

[root@node1 ~]# ./a.sh 10 20      # 传递两个参数进去
10+20=30
10-20=-10
10*20=200
10/20=0
4、逻辑运算

逻辑与:&&   相当于是AND的关系

第一个条件为假是,第二个条件不用再判断,最终结果已经有了,就是false

第一个条件为真时,第二个条件必须得判断

逻辑或:||   相当于是OR的关系

前一个命令的结果为真时,第二个命令就不执行

前一个命令的结果为假时,第二个命令必须执行

标签:脚本,Shell,expr,运算符,命令,bash,执行,调试
From: https://blog.csdn.net/2301_78088515/article/details/141937237

相关文章

  • jmeter通过beanshell中脚本实现随机获取某天(“yyyy-MM-dd HH:mm:ss“)前1周,一个月,一
    在接口测试中,请求参数中涉及时间的参数可能不是固定死的,因此jmeter想通过beanshell中脚本实现随机获取某天(statusTimeEnd(“yyyy-MM-ddHH:mm:ss”))前1周,一个月,一个季度,半年的时间0点,其中statusTimeEnd的值在用户参数中已配置。参考JMeter性能测试实战的方法:http://lit......
  • Springboot宠物领养系统0e60o(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着社会的进步和人们生活水平的提高,宠物已成为许多家庭的重要成员。然而,流浪宠物问题日益严重,不仅影响城市环境,也威胁着宠物的......
  • Springboot超市商品销售管理系统pbo52(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着超市行业的蓬勃发展,商品种类与数量不断增加,传统的手工管理模式已难以适应高效、精准的商品销售管理需求。为了提高超市运营......
  • Springboot车辆信息管理系统v3564--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着汽车保有量的快速增长,车辆信息管理成为了一个复杂而重要的任务。无论是政府机构、企事业单位还是个人车主,都面临着车辆信息......
  • Springboot城乡客运服务系统7y7y1--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称城乡客运服务系统设计与实现二、研究背景与意义随着城乡一体化进程的加速,城乡之间的交通联系日益紧密,客运需求持续增长。然而,传统的......
  • 【Shell-多并发】使用Shell脚本在循环中进行多并发的操作
    【Shell-多并发】使用Shell脚本在循环中进行多并发的操作1)方式一(利用for循环)1.1.案例一(缺少wait导致执行顺序有误)1.2.案例二(缺少控制阻塞导致任务全部执行)1.3.案例三(最终版)2)方式二(利用命名管道来做任务队列)3)Shell脚本中$的含义1)方式一(利用for循环)1.1.案例一(缺少wait......
  • linux shell一键查看服务器资源利用率之memory
    基于free-m命令实现[root@logstash~]#free-mtotalusedfreesharedbuff/cacheavailableMem:39313513346112343355Swap:396703967[root@logs......
  • 【Linux】全面讲解 Shell 变量的那些事
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • C++ 之 perf+火焰图分析与调试
    简介在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。1.Perf基础1.1Perf简介perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测......
  • python和C++中的运算符的一一对应
    在Python和C++中,许多运算符是相似的,因为它们都遵循许多基础的编程概念,比如算术运算、逻辑运算、位运算等。然而,也存在一些差异,尤其是在一些高级特性上,比如Python的动态类型和C++的静态类型。以下是一些常见的运算符在两个语言中的对应情况:算术运算符PythonC++描述++加法......