一、shell 的作用:
shell 的作用:
Linux系统中的shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的shell 解释器程序有很多种,使用不同的shell时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells文件可以了解当前系统所支持的shell 脚本种类。
注: nologin:奇怪的shell,这个shell可以让用户无法登录主机。
bash ( /bin/bash)是目前大多数Linux版本采用的默认shell。
为什么我们的系统上合法的shell要写入/etc/shells这个文件?
这是因为系统某些服务在运行过程中,会去检查用户能够使用的shells,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shell来工作?还有我这个默认会取得哪一个shell?
当我登录的时候,系统就会给我shell让我来工作,而这个登录取得的shell就记录在/etc/passwd这个文件内。
不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途目前大多数linux系统默认使用的是bash
shell,默认登陆shell是/bin/bash,可以查看/etc/passwd文件里注明这个shell是针对用户而言的,可以查看/etc/passwd里面的最后的字段使用的是哪个shell,如果想要修改可以用chmod -s或者chsh -s来重新指定
shell脚本是什么
shell脚本就是说我们把原来linux命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell脚本或shell程序:我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell脚本。
shell脚本能干什么
自动化完成软件的安装部署,如安装部署LAMP架构服务
自动化完成系统的管理,如批量添加用户
自动化完成备份,如数据库定时备份
自动化的分析处理,如网站访问量
shell脚本使用场景
在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率
如何学习shell脚本
熟悉掌握各种linux命令
掌握脚本的标准格式
掌握脚本的基本语法
shell脚本的构成
第一行为"#! /bin/bash" ,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如#! /usr/bin/python、# !/usr/bin/expect
注释信息:以"#“开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
可执行语句:如echo命令,用于输出" "之间的字符串
创建shell 程序的步骤:
第一步:创建一个包含命令和控制结构的文件。
第 二步:修改这个文件的权限使它可以执行 #使用chmod +x test.sh
第三步:检测语法错误
第四步:执行./first.sh
shell脚本的执行通常有以下几种方式
方法一:当前路径(决定路径与相对路径)下执行脚本(要有执行权限)
/home/first.sh或者./first.sh
方法二:sh 、bash脚本文件路径(这种方式可以不对脚本文件添加执行权限)
bash first.sh或sh first.sh
方法三: source脚本文件路劲(可以没有执行权限)source first.sh
方法四:其他方法
sh < first.sh或者cat first.sh l sh (bash)
例一:
显示命令(5种):
./命令要先授权(执行权限)然后才能显示
source显示命令的话会进入脚本里的/boot目录下
将aa.sh的脚本内容输出
例二、
二、重定向与管道操作
重定向:
用户通过操作系统处理信息的过程中,包括以下几类交互设备文件
标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。
从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。
重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用">“或”>>"操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。
">"意思是当原来文件中有内容的话,原来的内容会被覆盖掉
">>"意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容
将内核版本输入给kernel.txt中,然后查看
-a显示内核所有内容,上面的被覆盖了
追加
重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用"<“操作符。
通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用passwd命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合passwd命令的”–stdin”选项来识别标准输入) 。
将password.txt的内容输入给zhangsan
当输入0时代表输入文本结束(把cat << 输入的内容输出到1.txt中)
123 456代表输入到1.txt中
这是以1.txt文件作为输入设备了
默认情况下, cat命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台
错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用"2>“操作符
2个作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁。
使用"2>“操作符时,会像使用”>“操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应用"2>>”操作符
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符”>”"2>“将两类输出信息分别保存到不同的文件,也可以使用”&>"操作符将两类输出信息保存到同一个文件。
站在设备上理解,如:echo “a” > a.txt 就是站在设备角度上,把a输出到a.txt中,让a.txt中有a
cat < a.txt 站在设备角度就是输入到设备中
再例如:ll > a.txt (ll 就是显示内容,所以这里就是把显示的内容输出到a.txt中,这样a.txt中就会有ll查看的内容,ll<a.txt就会报错)
cat < a.txt 用cat查看a.txt,意思就是站在设备上接收a.txt的内容,所以为输入
/dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失。
而尝试从它那儿读取内容则什么也读不到。然而 /dev/null对命令行和脚本都非常的有用echo kgc > /dev/null
cat /dev /null #什么信息也看不到
&>和>&符号
&表示等同于的意思
例1:把正确和错误的消息输入到相同的位置1>&2把标准输出重定向到标准错误
2>&1把标准准错误重定向到标准输出,
ls /tmp xxxx>1.txt 2>&1
或:
ls /tmp xxxx2>2.txt 1>&2
例1:将错误显示的内容和正确显示的内容分开
ls /etc/passwd xxxx
结果:ls:无法访问xxx:没有那个文件或目录
/etc/passwd
把正确的信息输出到a.txt,ls看错误的内容,而cat a.txt可以看到正确的内容
把错误的内容输出到a.txt ,cat看的是错误的信息
把正确的内容输入到5.txt中,如果没有2>&1则显示错误的信息,正确信息要用cat 5.txt查看
这里有了2>&1:错误信息等同于正确信息一同输出到5.txt中,用cat看是就会同时显示
把错误的内容输出到8.txt中,1>&2:正确的内容等同于错误的内容一样输出到8.txt中,
如果1>&2没有则显示正确信息,错误信息用cat查看
把正确信息存放到7.txt中,显示错误信息加了1>&2后成正确信息等同于错误信息显示,而7.txt啥都没存了所以就错了(错误写法)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCCUCh7o-1642854402042)(C:\Users\ljw\AppData\Roaming\Typora\typora-user-images\1642475759401.png)]
&>正确信息错误信息都放到/dev/null中 /dev/dull是空洞里面的内容是看不到的
httpd自动安装脚本
授权
错误信息要输出到httpd.erro.log中,显示的是正确信息,错误信息用cat httpd.erro.log看
显示的是错误信息,正确信息被输出到right.log中了
管道操作
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号"I"左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
在 shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
b
a
s
h
bash
bash表示系统提示符,$表示此用户为普通用户,超级用户的提示符是#,bash是shell的一种,是linux下最常用的一种shell
$bash的意思是执行一个子shell,此子shell为bash。
/etc/passwd中以/bin/bash结尾的打印出第1列与第7列($符)
-F:指定:为输入行的分隔符
过滤出df-Th中以\结尾然后打印出第6列
a相当于一个软连接,输出$a相当于输出a=后的命令
总结:
重定向与管道操作是shell环境中十分常用的功能,若能够熟练掌握并灵活运用,将有助于编写代码简洁但功能强大的shell脚本程序。
三、shell的变量
变量是用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量就可以了。
常见 shell 变量的类型包括自定义变量、环境变量、只读变量、位置变量、预定义变量
自定义变量
1、变量的定义
Bash中的变量操作相对比较简单,不像其他高级编程语言(如c/c++、Java等)那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可
格或:变量名=变量值
变量名:临时存放数据的地方
变量值:临时的可变化的数据
等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(如+、-、*、/、 .、 ?、8、&、等)
用echo查看和引用变量的值
通过在变量名称前添加前导符号"$",可以引用一个变量的值,使用echo命令可以查看变量,可以在一条echo 命令中同时查看多个变量值
列1
Product=Python
version=2.7.13
echo P r o d u c t Product Productversion
变量的别名
当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号"{}为引用变量"(引用变量)将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值
列2
echo ${ Product}2.5
echo ${ test }RMB
不加{},且紧贴着写就会混淆无法显示结果
python的版本号
echo选项
echo -n 表示不换行输出
使用echo -e输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
\d不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n
\n换行
\t转义后表示插入tab,即制表符
注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\
将
输
出
"
将输出"
将输出""符号,而不当做是变量引用
不换行输出
-e输出转义字符,\n换行
\c后面的内容不显示
\t表示插入一个tab
加了\失去了别名的功能
read -p:“提示信息”变量名
取消定义
unset变量名
特殊操作
还有一些特殊的赋值操作,可以更灵活地为变量赋值,以便适用于各种复杂的管理任务
双引号(" )
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略
1、当内容中有空格
echo "hello world“
echo nihao
2、当以变量的值进行赋值
[root@localhost ~]# version=2
[root@localhost ~]# pyver=“python $version”
[root@localhost ~] #echo spyver
python 2
单引号( ’)
当要赋值的内容中包含KaTeX parse error: Undefined control sequence: \等 at position 4: ,",\̲等̲具有特殊含义的字符时,应使用单…test"
123
[root@localhost ~]. echo ‘$test’
$test
反撇号只跟命令
反撇号(` )
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。
反撤号括起来的范围内必须是能够执行的命令行,否则将会出错
%Y表示年,%m表示月,%d表示日,%H表示小时,%M表示分钟,%S表示秒,%s表示从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数,相当于time函数,%w表示一周中的第几天。实例见下:
%T是显示时间
显示年月日
使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用"$()”来代替反撇号操作,以解决嵌套的问题
列如:
-qf查看指定的文件或目录是哪个软件包所安装的
-qc列出已安装的指定软件的配置文件