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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南