Linux系统管理16:shell

​ shell是允许用户输入命令的界面,linux中最常用的交互式shell是Bash。

一、什么是shell

​ shell就是用户和操作系统内核之间的接口,起着协调用户和系统的一致性和在用户与系统之间进行交互的作用。
在这里插入图片描述

二、shell的功能

​ shell最重要的功能是命令解释,从这种意义上理来说,shell是一个命令解释器。

​ Linux系统中所有可执行文件都可以作为shell命令来执行。将可执行文件作为一个分类如下表。

类别 说明
Linux命令 存放在/bin,/sbin目录下
内指明了 处于效率考虑,将一些常用的命令的解释程序构造在shell内部
实用程序 存放在/usr/bin,/usr/sbin,/usr/local/bin等目录下的实用程序
用户程序 用户程序经过编译生成的可执行文件,也可以作为shelll命令运行
shell脚本 有shell语言编写的批处理文件

​ 当用户提交了一个命令后,shell首先判断它是否为内置命令,若是,就通过shell内部的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或使用程序,在硬盘中查找命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。

在查找一个命令时分两种情况

  • 1、用户给出了命令路径,shell就沿着用户给出的路线查找,若找到则调入内存,若没有找到则输出提示信息。
  • 2、用户没有给出命令的路径,shell就在环境变量OATH所指定的路径依次进行查找,若找到则调入内存,若没有找到则输出提示信息。

shell的功能

  • shell环境变量
  • 正则表达式
  • 输入/输出重定向和管道

三、shell环境变量

​ shell支持具有字符串值的变量

​ shell变量不需要专门的说明语句,通过赋值语句完成变量说明并予以赋值。

​ 在命令行或shell脚本文件中使用$name的形式引用变量name的值

1.变量的定义和引用

​ 在shell中,变量的复制格式如下:name=string其中,name是变量名,它的值就是string。变量名以字母或下划线开头的字母、数字和下划线字符序列。

​ 在变量名前加 s t r i n g 引用变量的值,引用的结果就是用字符串string代替 name的值。该过程也被成为变量替换。

>>> name = asdfsasdf
>>>echo $name
asdfsasdf

​ 在定义变量时,若string中包含空格、制表符和换行符时,则string必须使用"string"'string'的形式,即用单(双)将其括起来。双引号内允许变量替换,而单引号内则不可以。

​ 注:显示字符常量,要输出的字符串中没有特殊的字符,所以使用“”和‘’的效果是一样的。

>>>echo hello world
hello world
>>>echo 'hello world'
hello world
>>>echo "hello world"
hello world
>>> echo he's bag

​ 因使用特殊字符(’),由于‘不匹配,shell认为命令行没有结束,按enter键后出现系统第二提示符,让用户继续输入命令行,按ctrl+c组合键结束。

>>> echo "he's bag"
he's bag
>>> echo he\'s bag
he's bag

2.shell局部作用域

​ shell变量有着规定的作用范围。
​ shell变量分为局部变量和全局变量。

  • 局部变量作用范围仅仅限于命令行所在的shell或shell脚本文件中。
  • 全局变量作用范围包括本shell进程及其所有子进程。
  • 使用export内置命令将局部变量设置为全局变量。
>>> var1=linux
>>> var2=unix				当前shell中定义变量var1和var2
>>> export var2				设置var2为全局变量
>>> echo $var2
unix
>>> echo $$					显示当前shell的PID
1702
>>> bash					调用子shell
>>> echo ##					显示当前shell的PID
1636
>>> echo $var1				var1没有宝贝export,所以在子shell中没有值

>>> echo $var2				var2倍export,所以在子shell中仍然有值
unix
>>> exit
exit

3.环境变量

​ 环境变量是指由shell定义和赋初值的shell变量。
​ shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。
​ 所有环境变量都是全局变量,并可以由用户重新设置。

3-1Linux中常见的环境变量

  • PATH:指定明理路的搜索路径
  • HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
  • HISTSIZE:指保存历史命令的条数
  • LOGNAME:值当前用户的登录名
  • HOSTNAME:指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
  • SHELL:值当前用户用的是那种shell
  • LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
  • MAIL:值当前用户的邮件存放目录
  • PS1:命令基本提示符,对弈root用户是#,对于普通用户是$
  • PS2:附属提示符,默认是“>”

直接使用set命令可以显示用户当前所有环境变量的设置。:set

3-2 输出变量PATH的值

>>> echo $PATH
.....
>>> PATH=/TMP/			修改PATH
>>> echo $PATH
/tmp/
>>> PATH=....			改回原来的
>>> echo $PATH
.....
>>> PATH=/tmp:$PATH		修改PATH变量,将一个路径/tmp加到PATH变量前
>>> echo $PATH			
/tmp:......				在保存原有PATH路径的基础上进行了添加。shell在执行命令前,会先查找这个目录。

4.工作环境配置文件

​ shell环境依赖于多个文件的配置。用户并不需要每次登录后都对各种环境变量进行手工设置,通过环境设置文件,用户的工作环境的设置可以在登录的时候自动由系统来完成。环境设置文件有两种,一种是系统环境设置文件,一种是个人环境设置文件。

4-1 在系统中的用户工作环境设置文件(所有用户生效)

  • 登录环境设置文件:/etc/profile
  • 非登录环境设置文件:/etc/bashrc

4-2 在用户设置的环境设置文件(对用户自身生效)

  • 登录环境设置文件: $HOME/ .bash_profile
  • 非登录环境设置文件: $HOME/ .bashrc

*/etc/profile

在这里插入图片描述

*/etc/bashrc

profile
profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.
bashrc
bashrc 是专门用来给 bash 做初始化的。比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了。

*$HOME/ .bash_profile

​ 用户每次登录系统时被读取,里面的所有命令都会被bash执行。用户自己定义的环境变量设置。

*$HOME/ .bashrc

在这里插入图片描述

四、正则表达式

1.grep命令

​ grep是“global search regular expression and print out the line”的简称,意思是全面搜索正则表达式,并将其打印出来。https://www.linuxcool.com/grep
​ grep命令用来在文本文件中查找内容。指定给grep的文本模式叫做“正则表达式”。它可以是普通的字母或数字,也可以使用特殊字符来匹配不同的文本模式。
grep ‘welcom’ file //从指定文件中查找含有字符串的行

2.正则表达式

​ Linux定义了一个使用正则表达式的模式识别机制。
​ 正则表达式使用了一些特殊字符,所以所有的正则表达式都必须使用单引号括起来。
​ 正则表达式字符可以包含某些特殊的模式匹配字符。

字符表达式 作用
. 匹配单个任意字符
[list] 匹配字符串列表中的其中一个字符
[range] 匹配指定范围中的一个字符
[^] 匹配指定字符串或指定范围中以外的一个字符
40

五、重定向

在这里插入图片描述

六、管道

在这里插入图片描述

七、shell脚本

​ shell是一种功能强大的编程语言,用户可以在文件中存放一系列命令,这被称为shell脚本或shell程序,将命令、变量或控制有机地结合起来将会得到一个功能强大的编程工具。
​ shell脚本语言擅长处理文本类型的数据。

1.脚本的内容

​ shell脚本是以行为单位的,在执行脚本的时候会分解为一行一行并依次执行。
​ 脚本中所包含的成分主要有注释、命令、shell变量和结构控制语句。

shell中用于流程控制的内置命令

命令 说明
text expr 或**[exp]** 用于测试一个表达式expr(如真、假)
if expr then command-table fi 用于实现单分支结构
if expr then command-table else command-table fi 用于实现双分支结构
case…case 用于实现多分支结构
for …do…done 用于实现******for******型循环
while…do…done 用于实现当型循环
until…do…done 用于实现直到型循环
break 用于跳出循环结构
continue 用于重新开始下一轮循环

2.脚本的建立与执行

​ 用户可以使用vim编辑shell脚本文件。
​ 一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:
#!/bin/bash#!/bin/sh
注意
​ (1)在Shell中如果一行的第一个字母是#,则是注释,但是上面两个是写在第一行,所以不是脚本注释行,如果写在某个命令之后,则变成注释行。
​ (2)sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。

2-1 执行方式1

​ 将文件名作为shell命令的参数,调用格式:#bash script_file当被执行脚本文件没有可执行权限时使用。

>>> bash test.sh
>>> sh test.sh

2-2 执行方式2

​ 在当前路径下执行脚本(脚本需要有执行权限),需要将脚本文件的权限改为可

执行(即文件权限属性为x位)。
具体方法为:chmod a+x script-name。然后通过执行脚本绝对路径或者相对路径

就可以执行脚本。

​ 注意:在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使

用,导致出错。

>>> chmod a+x test.sh
>>> /tmp/test.sh
>>> ./test.sh

2-3 执行方式3

​ source script-name或者. script-name
​ source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。
注意:这是和其他几种执行shell方式的最大不同。

>>> source test.sh
>>> . test.sh
test.sh
>>> /tmp/test.sh
>>> ./test.sh

2-3 执行方式3

​ source script-name或者. script-name
​ source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。
注意:这是和其他几种执行shell方式的最大不同。

>>> source test.sh
>>> . test.sh

猜你喜欢

转载自blog.csdn.net/jiangSummer/article/details/106288933