shell 脚本的基础

目录

一、什么是shell脚本

二、有哪些表达式

一、变量

二、运算符

三、语句类型分哪几种

一、条件语句

二、分支语句

三、循环语句

四、函数

五、正则表达式

一、标准正则

二、扩展正则

六、文件操作四剑客

七、shell

一、shell是一种命令解释器

二、查看系统中支持的shell

三、查看系统默认的shell

八、变量

一、变量的组成

一、变量名

一、声明规范

二、声明方法

 ​编辑

二、变量值

二、变量的类型

一、系统内置变量(环境变量)

二、自定义变量

三、位置变量

四、预定义变量

三、作用域

四、输出

五、shell中的字符串

一、获得字符串长度

二、字符串取子串

三、字符串截取

四、字符串拼接

五、字符串替换

九、运算符

一、数学运算

二、比较运算

一、条件测试

二、数值比较

三、字符串比较

四、文件比较

五、逻辑运算符

 十、shell运行规则

十一、shell运行规则

一、没有x权限

二、有x权限


一、什么是shell脚本

Shell脚本是一种用于自动化操作系统任务的脚本语言。它是一种通过命令行界面执行的脚本,用于执行一系列的命令和操作,可以实现自动化的系统管理、文件处理、网络通信等操作。

Shell脚本通常运行在Unix或类Unix操作系统(如Linux)的命令行环境中。它使用一种脚本语言,可以调用操作系统提供的命令和工具,以及用户自定义的函数,实现一系列的操作和任务。

Shell脚本是纯文本文件,通常以.sh或.bash等扩展名结尾。它可以包含变量定义、条件判断、循环结构、函数定义等语法元素,用于实现复杂的逻辑和控制流程。

通过编写Shell脚本,用户可以批量执行一系列命令、处理大量的文件、定时执行任务、自动化系统管理等。Shell脚本是系统管理员、开发人员和运维人员常用的工具之一,能够极大地提高工作效率和操作方便性。

二、有哪些表达式

一、变量

预定义变量

位置变量

自定义变量

二、运算符

数学运算

数值比较

字符串比较

文件判断

布尔运算符

三、语句类型分哪几种

一、条件语句

if

二、分支语句

case

三、循环语句

for

while

四、函数

在Shell脚本中,函数是一种用于封装一系列命令和操作的结构。函数可以在脚本中定义和调用,它们使代码更模块化、可重用和易于维护。下面是一些关于Shell脚本函数的重要特点和介绍:

  1. 定义函数:在Shell脚本中,使用如下语法来定义函数:

    function_name() {
        # 函数体
    }
    

    函数名可以由字母、数字和下划线组成,不能以数字开头。函数体是一系列的命令和操作,用于实现特定的功能。

  2. 调用函数:在脚本中,可以通过函数名来调用相应的函数,如下所示:

    function_name
    

    调用函数时,脚本会执行函数体中的命令和操作。

  3. 函数参数:函数可以接受参数,以便在调用时传递数据给函数。参数使用特殊变量 $1$2$3 等表示,分别代表第一个、第二个、第三个参数,以此类推。在函数中可以使用这些变量来获取传入的参数值。

  4. 函数返回值:函数可以通过 return 语句返回一个值。返回值可以是一个整数或字符串,使用 return 语句后,脚本会终止当前函数的执行并返回该值。在调用函数时,可以使用 $() 或反引号来获取函数的返回值。

  5. 局部变量:在函数内部,可以使用 local 关键字声明局部变量。局部变量的作用范围仅限于函数内部,不会对外部的同名变量产生影响。

  6. 函数调用的结果:在脚本中可以使用特殊变量 $? 来获取函数调用的结果。如果函数执行成功,则 $? 的值为 0;如果函数执行失败,则 $? 的值不为 0。

函数在Shell脚本中起到了组织和模块化代码的作用,可以增强代码的可读性、可重用性和可维护性。使用函数可以封装一些常用的操作,减少代码的重复编写,并提高脚本的效率和可扩展性。

五、正则表达式

一、标准正则

  1. 标准正则表达式(BRE):

    • 基本元字符:.*[]^$
    • 限定符:*+?{m,n}
    • 字符类:[...]
    • 反向引用:\n
    • 范围表达式:[a-z][0-9]
    • 特殊字符转义:\
    • 匹配行首和行尾:^$

    在Shell中,默认情况下,正则表达式都使用标准正则表达式的语法。使用标准正则表达式时,不能直接使用元字符.|等,而是将它们作为普通字符进行匹配。

二、扩展正则

  1. 扩展正则表达式(ERE):

    • 扩展元字符:.*[]^$|(){}+?
    • 集合:[[:alnum:]][[:digit:]]
    • 字符类简写:\w\d\s
    • 分组:(pattern)
    • 逻辑操作符:|
    • 或操作符:?|pattern1|pattern2|...
    • 非贪婪操作符:*?+???
    • 扩展的范围表达式:{m,}{,n}{m,n}

    使用扩展正则表达式时,可以使用更多的特殊字符和语法来匹配和处理文本。

在Shell脚本中,可以使用工具如grepsed等来利用正则表达式进行文本的处理和匹配。

六、文件操作四剑客

1、find

2、egrep

3、sed

4、awk

七、shell

一、shell是一种命令解释器

  1. sh(Bourne Shell):是Unix操作系统中最早的Shell,功能相对较简单。其脚本文件通常以.sh为扩展名,可以在大多数Unix系统中使用。

  2. ssh(Secure Shell):是一种网络协议,用于在不安全的网络中提供安全的远程登录和文件传输。它也可以用作Shell脚本的远程执行工具。

  3. bsh(Bourne Again Shell):是Bash Shell的简称,是Bourne Shell的改进版本,为Unix和Linux系统提供了更多的功能和特性。

  4. csh(C Shell):是一种与C语言类似的Shell,具有更丰富的交互式功能,并提供了一些与C语言兼容的语法。

  5. bash(Bourne Again Shell):是Unix和Linux系统中最常用的Shell,也是默认的命令行解释器。它是基于Bourne Shell的改进版本,提供了很多功能和扩展。

  6. tcsh(TENEX C Shell):是C Shell的改进版本,增加了一些交互式和脚本编程的功能。

  7. dsh(Distributed Shell):是一个用于在多台远程主机上同时执行命令的工具,可以实现批量远程命令执行。

  8. zsh(Z Shell):是一个强大的Shell解释器,具有高级的命令补全、历史命令管理、拼写校正等特性,并提供了良好的脚本编程能力。

二、查看系统中支持的shell

cat /etc/shells

shell 脚本的基础_第1张图片

三、查看系统默认的shell

echo $SHELL

shell 脚本的基础_第2张图片

八、变量

一、变量的组成

一、变量名

不会变化

可以理解为一个容器 只是里面装的内容不一样而已

一、声明规范

不能是数字或者数字开头

shell 脚本的基础_第3张图片

要以_或字母开头

变量名不能包含特殊字符

shell 脚本的基础_第4张图片

二、声明方法

驼峰式   userName

 

双驼峰 UserName

NameALL这种也是双驼峰型

shell写法

user_name

username

USERNAME(在shell脚本中大写的字母一般用来表示常量或者全局变量)

二、变量值

不断变化 承载的物体(里面可以装任何东西,不固定)

数字、字符 

二、变量的类型

一、系统内置变量(环境变量)

env

二、自定义变量

定义一个变量名,定义一个变量值 用赋值符号连接

varName=varValue

等号两边不能有空格

数字    var1=1

字符串
shell中可以不使用引号
当包含有空格时,需要使用引号

引号的用法      不会引用变量值    单引号  '
会应用变量值   双引号   "
引用命令结果   反撇号   `
$(命令)
应用场景较多

shell 脚本的基础_第5张图片

三、位置变量

$0 表示自身
$1 表示位置参数
$@

表示所有参数的列表

脚本内只能设置九个位置变量 脚本外不受限制

脚本后参数所在的位置就是位置变量(默认有9个位置变量 $1...$9)

shell 脚本的基础_第6张图片

 相当于运行脚本的时候把后面两个参数一起传进来

直接启动没有颜色,但是ls有特殊性可以不跟参数

shell 脚本的基础_第7张图片

 他是要调个别名

shell 脚本的基础_第8张图片

想让他恢复颜色

再次更改脚本

shell 脚本的基础_第9张图片

保存退出并验证

成功 

传参数

./first.sh /opt/ /home/ (正着填写,反着验证)

shell 脚本的基础_第10张图片
 

shell 脚本的基础_第11张图片

特性只能从第一个位置变量跟到第九个位置变量

四、预定义变量

$0      脚本本身的名称 (运行自己)

脚本配置文件开头的格式应该是#! /bin/bash

代表从此刻开始所有的语句都是由bin/shell解析

shell 脚本的基础_第12张图片

 赋予权限

shell 脚本的基础_第13张图片

一直运行自己

查看带颜色的脚本

.$#    脚本后参数的个数 (输出脚本后跟的位置变量的个数)

 查看到底传进来几个参数

更改脚本 添加 echo $# 并验证

shell 脚本的基础_第14张图片

 shell 脚本的基础_第15张图片

 成功显示参数的个数

以此类推 每追加在验证 都会出现变化

shell 脚本的基础_第16张图片

如果加很多,他最多也只调9个,后面的调不出来,但是参数的个数正常显示

 $* 脚本运行时参数的内容(整体输出 位置变量参数的内容)

shell 脚本的基础_第17张图片

验证

shell 脚本的基础_第18张图片

最下面单独显示了一遍结果 

$@ 脚本运行时参数的内容(逐个输出 位置变量的内容)

shell 脚本的基础_第19张图片

验证 

shell 脚本的基础_第20张图片 显示结果一致,$@是拼接式输出 不会换行 显示一样但是并不一致

验证脚本

shell 脚本的基础_第21张图片

 第七行 逐个输出$*的内容

echo输出会换行检质

shell 脚本的基础_第22张图片

想要区别 $* 和 $@的区别 就写这样一个脚本

shell 脚本的基础_第23张图片

并验证

shell 脚本的基础_第24张图片

$? 脚本运行完毕后的返回值

默认情况 0成功 非0失败

shell 脚本的基础_第25张图片

这种提示成功

shell 脚本的基础_第26张图片

 这种则提示失败

三、作用域

默认变量只在当前shell下生效

定义一个值 验证后刷新,在验证则失效 

shell 脚本的基础_第27张图片

 这种就是局部变量只在当前shell下生效 (刷新等于开启了一个子shell,不生效)

若要在当前及其子shell下生效,需要声明为全局变量    export (将局部变量升级为全局变量,全局变量不是在任意的shell下都可以调,必须是当前shell及其子shell才可以,切新shell则无效)

shell 脚本的基础_第28张图片

 验证则成功生效

四、输出

echo $varName

五、shell中的字符串

举例 先赋值  str1=foodfornoting.gpg

一、获得字符串长度

echo ${#str1}

语法:    ${#StringName}

shell 脚本的基础_第29张图片

 显示结果为 17个字符

二、字符串取子串

echo ${str1:0:3} 从哪里开始 取几个  从0就是从第一个开始 往后三个则显示foo

如果是 -4的话则是从左往右 显示 foodfornoting

语法:    ${#StringName:position:lenght}

shell 脚本的基础_第30张图片

三、字符串截取

1、echo ${str1##*fo}  从左至右截取最后一个匹配字符串string之后的所有字符串

从左往右查找最后的字符显示后面的内容

语法:    ${StringName##*string}

shell 脚本的基础_第31张图片

2、echo ${str1#*fo} 从左至右截取第一个匹配字符串string之后的所有字符串

从左往右查找第一个字符的内容并显示后面的内容

语法:    ${StringName#*string}

shell 脚本的基础_第32张图片

3、echo ${str1%%o*}  从右至左截取最后一个匹配字符串string之后的所有字符串

从右往左查找最后一个字符串并显示后面的内容

语法:    ${StringName%%string*}    

shell 脚本的基础_第33张图片

4、echo ${str1#*fo} 从左至右截取第一个匹配字符串string之后的所有符串

语法:    ${StringName#*string}

shell 脚本的基础_第34张图片

5、echo ${str2%%o*} 从右至左截取最后一个匹配字符串string之后的所有字符串

语法:    ${StringName%%string*}    

shell 脚本的基础_第35张图片

6、echo ${str2%o*} d)从右至左截取第一个匹配字符串string之后的所有字符串

语法: ${StringName%string*}

shell 脚本的基础_第36张图片

四、字符串拼接

StringName3=${StingName1}${StringName2}

shell 脚本的基础_第37张图片

五、字符串替换

语法:    ${StringName/OldString/NewString}

shell 脚本的基础_第38张图片

九、运算符

一、数学运算

shell 脚本的基础_第39张图片

+

-

*

shell 脚本的基础_第40张图片

因为*也有代表全部的意思 所以为了让系统识别是运算 要添加转义符 * 作为乘号时需要加转义符\

%(除)

shell 脚本的基础_第41张图片

shell不支持浮点数的显示

二、比较运算

一、条件测试

shell 脚本的基础_第42张图片

二、数值比较

-eq    等于  echo $? 查看结果 0显示成功 非0表示失败

shell 脚本的基础_第43张图片
        -ne    不等于

shell 脚本的基础_第44张图片
        -lt    小于

shell 脚本的基础_第45张图片
        -le    小于等于

shell 脚本的基础_第46张图片
        -gt    大于

shell 脚本的基础_第47张图片
        -ge    大于等于

shell 脚本的基础_第48张图片

 test          测试

三、字符串比较

=  字符串一致

!= 字符串不一致

-z 字符串为空

shell 脚本的基础_第49张图片

!     -z   字符串不为空

四、文件比较

 -e 文件或目录是否存在

shell 脚本的基础_第50张图片
 -f        是否为文件

shell 脚本的基础_第51张图片
 -d        是否为目录

shell 脚本的基础_第52张图片
  -r        判断文件是否可读

shell 脚本的基础_第53张图片
 -w        判断文件是否可写

shell 脚本的基础_第54张图片
 -x        判断文件是否可执行

 shell 脚本的基础_第55张图片

五、逻辑运算符

shell 脚本的基础_第56张图片

 十、shell运行规则

shell脚本编写规范
第一行    #!/bin/bash
第二行    #脚本的说明
第三行    脚本正文

shell 脚本的基础_第57张图片

十一、shell运行规则

一、没有x权限

bash  脚本所在路径/脚本文件

source 脚本所在路径/脚本文件

.      脚本所在路径/脚本文件

shell 脚本的基础_第58张图片

二、有x权限

./脚本文件

脚本绝对路径/脚本文件

shell脚本运行追踪     bash -x 脚本所在路径/脚本文件

echo $[$RANDOM%100]   返回100内随机数

shell 脚本的基础_第59张图片

 seq 1 10      返回1到10 的连续数字

{1..10}           返回1到10 的连续数字

shell 脚本的基础_第60张图片

seq 1.1 10.1          返回1.1 2.1 3.1.... 10.1

 shell 脚本的基础_第61张图片

你可能感兴趣的:(服务器,linux,运维)