栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

SHELL

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SHELL

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 一.什么是shell
  • 小结:
  • 二.shell脚本的设计与运行
    • 实验1:
      • 1.编写一个Hello Word脚本
      • 2.执行shell脚本
          • 方法一.需要为文件赋予可执行的权限
          • 方法二.不需要文件有可执行的权限
  • 小结:
  • 三.变量
      • 1. 自定义变量
      • 2.查看变量
          • 例1:
          • 例2:
      • 3.系统预设变量
      • 4.位置变量
          • 应用示例:
      • 5.预定义变量
          • 示例1:
  • 小结
      • 6.变量的扩展应用
      • 7.read命令定义变量
      • 8.全局 or 局部变量
  • 总结


一.什么是shell

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

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

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

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

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

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

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

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

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

shell就是这些解释器的总称

常见的shell解释器

常见的shell解释器
/bin/bash
/bin/sh
/bin/csh
/bin/tcsh

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

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

Bash基本特性

Bash基本特性
快捷键、TAB键补齐
命令历史(history)
命令别名(aliase)
标准输入与输出的重定向(>、>>、2>、2>>、&>)
管道(|)
Shell执行命令的方式

交互式(命令行)

人工干预

逐条解释执行、效率低

非交互式(脚本)

需要提前设计

批量执行、效率高

小结:

区分shell和bash

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

二.shell脚本的设计与运行

编写shell脚本

什么是脚本

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

顺序执行

解释器逐行解释代码

实验1: 1.编写一个Hello Word脚本

首先新建一个文件

添加可执行语句(命令)

给文件添加x权限

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

注意:

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

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

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

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

可执行的语句

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

2.执行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脚本文件(不会开启子进程)

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

三.变量 1. 自定义变量

定义变量
以固定的名称,存放可以能有变化的值
定义变量的格式:变量名=变量值
取消变量的格式:unset变量名

注意事项
=两边不能有空格,不要使用关键字做变量名,如ls、cd等√如果变量名已经存在则覆盖之前的变量值
变量名称由:字母/数字/下划线组成,不能以数字开始

2.查看变量

查看变量的语法格式
$变量名
${变量名}

例1:

定义变量和吊用变量

这里我们定义a=10,那么调用变量echo $a就会显示10
如果我们第二次再定义变量的时候,第二次这个变量名已经存在则这个变量会被覆盖
如a=20,那么我们调用变量echo $a就会变成20

此时变量a就被覆盖变为20
在定义变量时要注意“=”两边不能有空格,同时变量名不能使用特殊符号

例2:

在调用的时候,如果在一些特殊的情况下,有可能直接调用变量会产生错误
我们先定义变量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此时的输出便会为空

3.系统预设变量

变量类型

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

位置变量(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
这些将来编写脚本的时候可能就会需要去调用这些变量,这些变量的特点就是不需要我们自己去定义,可以直接去引用这些变量的值

4.位置变量

存储脚本执行的参数

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

$1、 2 、 … 、 2、…、 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.

5.预定义变量

用来保存脚本程序的执行信息
直接使用这些变量
不能直接为这些变量赋值

变量名含义
$0当前所在的进程或脚本名
$$当前运行进程的PID号
$?命令执行后的返回状态,0表示正常,1或其他值表示异常
$#已加载的位置变量的个数
$*所有位置变量的值
示例1:

首先我们看$?
第一 .命令执行后,$?是返回上一条命令执行的结果,

     如果这条命令返回的结果是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

小结

熟悉变量的使用

自定义变量

环境变量

位置变量

预定义变量

6.变量的扩展应用

各种引号

多种引号的区别

区分三种定界符

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

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

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

不加引号和加双引号的区别

● 不加引号内容会被识别为很多个字符

例:

新建一个文件a b c 再新建一个文件“a b c”

命令ls -l可以看到不使用引号的时候计算机会新建三个文件,当我们使用引号的时候a b c会被视为一个整体

● 双引号和单引号

当双引号中有变量的时候,变量会被扩展出来,也就是取变量的值

双引号中使用$取hu这个变量的值
如果这个变量放到单引号中,单引号会屏蔽特殊符号的含义,会禁止他去扩展这个变量的值
$不再识别是一个去变量值的特殊符号,计算机会当做一个普通的字符显示
不加引号的时候计算机会理解很多个内容,加引号是引用整体
单引号和双引号的区别就在于是否允许它识别这些特殊符号

使用系统变量“显示当前用户的id是”

可以看到变量都被扩展出来取了变量的值,当前用户是root,它的id号是0

但是当使用单引号的时候,那$这样的字块就变成一个普通的字符串,原样输出

● 反引号

命令cat查看之前编写的sleep.sh
然后用test加(键盘数字1左边的)`cat sleep.sh`做一个变量 加号之后,我们取test的变量的时候,所取的就是反引号内的命令,而不是字符串

同样的$()和``的效果相同
我们要的不是这条命令的本身,而是命令执行之后的结果

7.read命令定义变量

read标准输入取值
read从键盘读入变量值完成赋值
格式:read [-p“提示信息“] 变量名
-p可选,-t可指定超时秒数,-s设置是否在终端显示输入的内容
例:
首先vim read.sh编辑一个read脚本
这里先定义一个变量名为name
再定义一个变量名为pass
在编写这个脚本的过程中只是定义了变量,并没有给它赋值,
当执行这个脚本的时候就会给这个赋值
赋完值之后就可以创建用户修改密码


这里创建用户修改密码成功,但这里密码是明文显示的,会有安全隐患
这里就可以用一个-s参数,-s参数就可以不在终端显示我们输入的信息

加上-s之后交互这里密码位置已经可以不显示
read -t 选项,可指定超时秒数,假如
read 跟定义项之后可以看到光标一直停留在定义的位置

read -t 5 yang ,-t 5意为停留5秒没有操作就会跳回命令输入模式

8.全局 or 局部变量

变量的作用范围

局部变量
新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用

全局变量
全局变量在当前Shell及子Shell环境中均有效

首先打开两个窗口以便更好的观察

这时候可以看到两个进程,一个是打开了pstree的进程,另一个是新开的进程,之后所打的命令都是在这个bash解释器上进行的

然后我们在新开的进程中定义一个变量x=100,这里定义了x=100,执行了$x显示也是100
这里就是定义了一个局部变量,局部变量的特点是仅在当前有效,
如果我们再开了子进程,那么它在子进程中就无法生效了
接着我们再打开一个bash

下面黄色框内的就是我们新开的bash子进程

我们之前在红色框的bash进程下定义了x=100,因为这个是个局部变量,所以当我们运行了子进程之后,这个定义就失效了

这里我们再运行echo $x的时候,显示已经为空,在这里x没有北定义

这就是局部变量,局部变量也就是仅在当前有效,在它的子进程是无效的
与局部变量相反的,全局变量就是在上面有效,在底下有效,在底下启若干个子进程也一样是有效的
这里退出之前的bash,然后我们再定义一个z=50
echo $z可以看到定义的变量50
我们再打开一个bash的子进程,然后echo $z,还是会显示定义的变量50,同理之后的bash也是

这里可以看到之后开了个子进程,在每个子进程中怡然能看到z的值,这种变量就是全局变量

总结

熟悉单引号,双引号,反引号的区别

单引号和双引号都是为了引用一个整体,区别在于单引号可以屏蔽特殊符号,而双引号不会

在双引号中可以使用变量,在单引号中会被当成普通的字符串来使用

反引号引用的是命令,我们取的不是命令本身而是命令的执行结果

和反引号等效的是$()

第二我们可以使用read去定义变量,在编写脚本时候用read定义变量并不会为它赋值

未来谁执行这个脚本就自行定义这个变量的值

最后就是变量时有一定范围的,有局部变量和全局变量

局部变量就是当前定义仅在当前有效

全局变量在当前定义,在未来的子进程中都是有效的

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/830248.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号