ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

shell

2022-04-01 09:01:35  阅读:179  来源: 互联网

标签:脚本 解释器 shell 变量 sh 执行 bash


一. 什么是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,变量,sh,执行,bash
来源: https://www.cnblogs.com/geranium/p/16069248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有