shell

2022/4/2 7:21:18

本文主要是介绍shell,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一. 什么是shell

 

计算机底层是由硬件组成(比如硬盘,内存,CPU)这些都是计算机的硬件

如果一台计算机只有硬件的话我们是没有办法去使用他的,

所以我们需要在底层硬件的基础上去安装操作系统,安装系统的内核

比如说家用电脑我们往往会安装windows系统,而在企业服务器上面我们通常会安装Linux操作系统,操作系统的内核人是没有办法直接操纵使用的

在上图中,最外层是用户和应用程序,人习惯用自然语言来表述,而计算机往往使用的是0和1的二进制来处理问题

那么此时我们就需要中间有一个翻译官,一个解释器

在之前学习使用过ls命令,cat命令以及使用cd命令,这些命令都是英文的自然语言,而计算机是无法识别这些英文字符的,计算机能处理的是0和1的二进制

如何解决这个问题,我们就需要中间有一个翻译官和解释器,他来把我们输入的英文字符翻译解释为计算机可以处理的0和1的二进制程序

不同的命令就需要不同的解释器

shell就是这些解释器的总称

常见的shell解释器

/bin/bash

/bin/sh

/bin/csh

/bin/tcsh

解释器负责将用户的指令翻译为内核可以识别的指令

通过usermod、chsh可以更改登陆shell

Bash基本特性

快捷键、TAB键补齐

命令历史(history)

命令别名(aliase)\

标准输入与输出的重定向(>、>>、2>、2>>、&>)

管道(|)

Shell执行命令的方式、

交互式(命令行)

人工干预

逐条解释执行、效率低

非交互式(脚本)

需要提前设计

批量执行、效率高

小结:

区分shell和bash

shell是所有解释器的一个总称,bash有很多的特色和功能,对于我们工作和学习更高效快捷

 

shell脚本的设计与运行

编写shell脚本

什么是脚本

提前将一些可执行的命令写入到一个文件中,计算机会按命令执行

顺序执行

解释器逐行解释代码

 实验

编写一个Hello Word脚本

首先新建一个文件

添加可执行语句(命令)

给文件添加x权限

 

注释:执行中./first.sh中的./ 是指当前目录

以上脚本并非一个规范的脚本

一个合格规范的脚本应该包含以下这些内容

#!脚本声明(使用哪种解释器解释代码)

注释信息(步骤、思路、用途等),以#开始的为注释信息

可执行的语句

 

 

 以上就是一个合规范的脚本格式

执行shell脚本

执行脚本的多种方式

方法一,需要为文件赋予可执行的权限

绝对路径执行

相对路径执行

 

首先我们执行irst.sh时可以正常执行

当我们取消了first.sh的x权限之后,再执行first.sh就会显示(Permission denied)权限不够

无论是绝对路径或者相对路径都无法执行

 

方法二,不需要文件有可执行的权限

sh  脚本文件名

source  脚本文件名

#不会启动子进程,通过pstree查看进程树

 

这边可以看到标记内的first.sh是没有x执行权限的

我们可以执行sh或者bash或者source,执行这些程序的时候,把脚本文件作为这些程序的参数就可以执行

这里的sh,bash和source是具有可执行权限的,我们执行的并不是脚本本身,

我们是先打开sh,bash或者source解释器,这些解释器本身就可以解释shell脚本

所以先打开解释器后面跟脚本作为参数,那么这边解释器就会逐行读取这些文件

 注意:

这里我们需要了解一个名称叫子进程

什么是子进程,我们可以通过pstree来查询计算机中的所有子进程信息

 上图中可以看到我们计算机中开启的第一个子进程就是systemd,后续开启的所有进程都是systemd的子进程

 首先我们需要再开两个同样的对话框以方便我们观察

 

 接下来我们在第一个对话框vim编辑一个临时脚本sleep.sh睡眠100秒

 

 

 然后接下来我们用sh执行这个脚本,于是计算机进入睡眠模式

 

 然后我们打开对话框二,输入命令pstree

 

 我们可以看到首先红色方框的sshd远程了linux服务器,然后计算结远程成功了之后开启了一个黄色方框bash的解释器

在bash解释器下,我们在命令行执行了蓝色框sh的一个程序,通过sh的子进程去读取脚本运行了绿色方框的sleep

同理bash运行脚本也会开启同样的子进程

 

 

 不同的source执行脚本时是不会开启子进程

 

 

 这边我们看到bash解释器下没有source的子进程而直接运行了脚本,这就等同于在命令行直接输入了sleep一样

这个在sleep脚本下不会造成影响,这里会有影响的,如:我们再编辑一个exit的脚本

 

我们同时运行sh,bash和source,

 

 

 sh和bash运行脚本后都退回到命令界面,而source运行脚本后直接退出了连接

这里因为sh和bash都会在bash进程下开启自己相对应的子进程,当运行exit后就会退出自己相对应的子进程

而souce并没有自己对应的子进程,在运行exit之后就会退出现有的bash进程,则就会出现连接断开的情况

 

小结:

熟悉编写脚本的流程

新建文件,编写代码,赋予脚本权限,执行脚本

熟悉执行脚本的多种方式

绝对路径、相对路径执行脚本

sh脚本文件、bash脚本文件、source脚本文件(不会开启子进程)

编写脚本需要规范,适当的注释,必要的说明是编写脚本良好的习惯

 

变量

自定义变量

定义变量

以固定的名称,存放可以能有变化的值

定义变量的格式:

变量名=变量值

取消变量的格式:

unset变量名

注意事项

=两边不能有空格,不要使用关键字做变量名,如ls、cd等√如果变量名已经存在则覆盖之前的变量值

变量名称有:字母/数字/下划线组成,不能以数字开始

查看变量

查看变量的语法格式

$变量名

${变量名}

例:

定义变量和吊用变量

 

 这里我们定义a=0,那么调用变量echo $a就会显示10

如果我们第二次再定义变量的时候,第二次这个变量名已经存在则这个变量会被覆盖

如a=20,那么我们调用变量echo $a就会变成20

 

此时变量a就被覆盖变为20

在定义变量时要注意“=”两边不能有空格,同时变量名不能使用特殊符号

 

在调用的时候,如果在一些特殊的情况下,有可能直接调用变量会产生错误

我们先定义变量x=hu

 

 我们去回写x的值显示是hu,我们加{x}回写的值也是hu

 

 但是当我们回写x2.5和x10.5,我希望回写的是hu2.5或者hu10.5,但是结果显示都只是显示.5

为什么这里没有出现我们希望显示的内容

因为,对于计算机来说,它认为我们要显示的是变量名为$x2,计算机会理解的是有一个变量叫$x2,你希望显示x2的值

但在我们的系统里并没有定义过x2,所以x2变量的值为空,那后面就直接显示了.5

变量名不可能使用特殊符号,所以计算机不会理解有一个特殊符号x2.5,它只会理解变量名是x2

这样它前面$x2无法识别为空,后面正常输出.5

这里,我们将x放入{}中,echo ${x}2.5

 

 这样这里就可以正常输出

如果我们这边这个变量使用完了,不再使用了,后期我们可以取消变量unset x

 

 取消变量后我们再输入echo $x此时的输出便会为空

 

系统预设变量

变量类型

环境变量(变量名通常大写,有操作系统维护)

位置变量(bash内置变量,存储脚本执行时的参数)

预定义变量(bash内置变量,可以调用但是不能赋值或修改)

自定义变量(用户自主设置)

 

环境变量

存储在/etc/profile或~/.bash_profile

命令env可以列出所有环境变量

常见环境变量:

PATH、PWD、USER、UID、HOME、SHELL

 PATH 命令也叫命令搜索路径

作用:我们平时在计算机里执行命令的时候,它就会去PATH路径下去找有没有该命令,找到就执行,没有就会往后找

           如果到最后都找不到的话计算机就会报错命令找不到

 

 如果我们将PATH定义为空,那么我们再执行命令的时候就会报错,因为我们PATH路径不对了,

 

我们将PATH命令修改回去,然后命令又可以正常执行了

 

这边注意,这边定义的变量时临时的,当你关闭终端之后,重新打开后,PATH就会被重置回原来的值,所以如果不小心更改了PATH的变量又不记得路径的话,直接关闭终端再重新打开就可以恢复

PWD命令显示当前所在路径的变量

显示当前做在工作目录

 

 USER命令显示当前的用户名

 

 UID是当前用户的id号,因为当前用户是root,所以id号是0

 

 HOME就是显示当前用户的家目录位置,root的家目录就在根下的root

 

 SHELL是现实当前用户所使用的shell解释器是哪种,计算机里面可能解释器有很多,我们当前正在用的shell就是/bin/bash

 

 这些将来编写脚本的时候可能就会需要去调用这些变量,这些变量的特点就是不需要我们自己去定义,可以直接去引用这些变量的值

 

位置变量

存储脚本执行的参数

使用$n表示,n为数字序列号

$1、$2、…、${10}、${11}、…

 首先我们先vim编辑一个脚本123.sh

 

 位置变量,就是我们在执行脚本的时候添加的参数,

这边aa对应的是脚本中变量的$1,bb对应的是脚本变量中的$2,cc对应的是脚本变量中的$3

 

 

 脚本中的echo $1就是回写$1,对应的就是执行命令是的第一个aa,同理$2和$3

应用示例:

使用变量创建单个系统用户

第一步:创建一个new.sh的文件,并编辑内容如下

 

 第二步:给这个文件增加权限,并执行,因为$1和$2是变量,所以在执行后面需要跟参数

参数就是用户名jack 密码123123

 

 执行完之后看到更改用户jack的密码,验证令牌已经更新成功说明我们已经创建了名为jack的密码123123的用户

此时我们用grep查找该用户可以看到已经可以在系统中看到该新增用户

注意:如果是英文版的话,中文那块为

Changing password for user jack.
passwd: all authentication tokens updated successfully.

 

预定义变量

用来保存脚本程序的执行信息

直接使用这些变量

不能直接为这些变量赋值

 

 示例:

首先我们看$?

第一 .命令执行后,$?是返回上一条命令执行的结果,

         如果这条命令返回的结果是0则代表上一条命令成功执行

         如果这条命令返回的结果是非0则代表上一条命令执行失败

 

 我们查看123.sh,因为有这个文件,所以正常查看了该文件内的内容,这是一条正确的命令

用echo $?命令返回上一条命令,这里显示是0,则代表执行时成功的

然后我们查看xxxx文件,因为系统中没有该文件所以显示没有那个文件或目录

用echo $?命令返回上一条命令,这里显示是非0,则代表执行时失败的

 

第二.我们去ping一个ip,ping 192.168.72.10本机的ip

 

 这边看到ping本机的ip是通的,然后我们用$?返回显示为0,说明上一条命令是执行成功的

然后我们去ping一个不存在的地址ping 192.16826.30

 

 这边我们可以看到ping是没有通的,用$?返回显示为非0 说明执行失败

 

第三.另外几个预定变量

我们vim编辑一个bian.sh

 

 

 

 

小结

熟悉变量的使用

自定义变量

环境变量

位置变量

预定义变量

 

变量的扩展应用

各种引导

多种引号的区别

区分三种定界符

双引号“ “:允许扩展,以$引用其他变量

单引号‘ ’:禁用扩展,即便$也视为普通字符

反引号' ':将命令的执行输出作为变量值,$()与反引号等效

Shell是用户与Linux内核之间的解释器



这篇关于shell的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程