目录
一、Shell脚本
1.shell是什么
Shell是计算机操作系统中提供用户界面的一种程序。它是用户与操作系统内核(kernel)之间的交互界面,允许用户通过命令行输入和执行各种操作系统命令和程序。Shell接受用户输入的命令,并将其转换为操作系统能够理解的形式,然后执行这些命令,并将结果返回给用户
Shell是一个命令解释器
1.1shell脚本的概念
(1)将要执行的命令按顺序保存到一个文本文件
(2)给该文件可执行权限
(3)可结合各种Shell控制语句以完成更复杂的操作
1.2常见的几种shell
1. Bourne Shell (sh):
Bourne Shell是Unix系统最早的标准Shell,由Stephen Boume开发。它是许多现代Shell的基础,但功能较为基础,缺乏一些现代Shell的特性。在一些较老的Unix系统中仍然使用
2.Bourne Again Shell (bash):
Bourne Again Shell,通常简称为bash,是GNU项目的一部分,也是Linux系统中最常用的Shell。bash是Bourne Shell的增强版,具有更多的特性和功能,包括命令行历史、命令补全、条件测试等
3.C Shell (csh):
C Shell是由Bill Joy开发的一种Shell,特点是语法类似于C语言。它引入了一些类C语言的特性,例如循环和条件语句的语法更接近于C语言,适合于一些习惯于C语言风格的用户
4. Korn Shell (ksh):
Korn Shell是由David Korn开发的Shell,结合了Bourne Shell和C Shell的特点,并且添加了一些新的特性。它在功能上比Bourne Shell更强大,但比bash略逊一筹。Korn Shell在一些商业Unix系统中被广泛使用
5.Z Shell (zsh):
Z Shell是一个强大的Shell,结合了bash、ksh和tcsh的优点,并引入了许多新的特性。它支持更高级的命令行历史管理、更强大的自动补全功能以及更灵活的配置选项。Z Shell通常作为bash的替代品,特别是在需要更高级特性和更好用户体验的情况下
2.shell的作用
Shell在计算机操作系统中有多种重要作用,主要包括以下几个方面:
1.用户交互界面:
Shell是用户与操作系统内核(kernel)之间的主要交互界面。用户通过Shell可以输入命令、执行程序,以及管理文件和系统资源等。这种交互方式通常是通过命令行界面(CLI)实现的,例如在Unix/Linux系统中常见的终端窗口
2.命令解释和执行:
Shel作为一个命令解释器,负责解释用户输入的命令,并将其转换成操作系统能够理解和执行的形式。用户可以通过Shell来启动程序、管理文件、修改系统配置等,例如使用ls命令列出当前目录的文件
3.环境控制和管理:
Shell控制用户和程序的执行环境,包括设和管理环境变量、当前工作目录、文件权限等。这些环境设置对于程序的正确运行和操作系统资源的合理利用至关重要
4.脚本编写和执行:
Shell支持编写脚本文件,通常称为Shel脚本(shell script)。这些脚本文件包含了一系列的Shell命令和控制结构,能够自动化完成一些复杂或者重复性的任务。脚本可以提高操作效率,简化系统管理和维护过程
5.权限管理:
Shell通过操作系统的权限机制控制用户对系统资源的访问权限。用户在执行命令时,Shell会验证用户的身份和权限,确保只有被授权的用户可以进行特定的操作,这有助于系统的安全性和稳定性
6.系统管理:
操作系统本身通常也会使用Shell脚本来进行系统管理和维护任务,如启动时的初始化、定期的备份任务、日志和文件的管理等。这些任务通常是通过预先编写的Shel脚本来自动化完成的
2.1shell脚本应用场景
(1)重复性操作
(2)交互性任务
(3)批量事务处理
(4)服务运行状态监控
(5)定时任务执行(6)········
2.2用户的登录shell
登录后默认使用的Shel程序,一般为 /bin/bash
不同Shell的内部指令、运行环境等会有所区别cat /etc/shells
/bin/sh #是bash命令的软链接 (已经被/bin/bash所替换)
/bin/bash #基准于GNU的框架下发展出的Shell
/usr/bin/sh #已经被bash所替换
/usr/bin/bash #centos和redhat系统默认使用bash shell
/bin/tcsh #csh的增强版,与csh完全兼容,整合了csh,提供更多的功能
/bin/csh #已经被/bin/bash 所替换 (整合C shell,提供更多的功能)注:
nologin:奇怪的shell,这个shell可以让用户无法登录主机
bash (/bin/bash)是目前大多数Linux版本采用的默认Shell
3.shell执行命令的方式
1.交互式执行:
用户在命令行界面(如终端窗口)中直接输入命令,按下回车键执行。Shell会立即解释并执行这些命令,并将执行结果输出到终端上。这种方式适合用户需要实时交互和反馈的场景,例如手动输入命令查询文件列表或执行简单操作
2.批处理执行:
用户可以将一系列的Shell命令写入一个文本文件,通常称为Shell脚本(shell script)。然后通过执行该脚本文件来批量运行这些命令。在Unix/inux系统中,可以使用 bash、sh 等Shell解释器执行脚本。这种方式适合需要重复执行一系列操作的场景,如自动化任务、系统管理等
3.后台执行:
用户可以在命令后面添加&符号,使得命令以后台方式执行。这样命令将在后台运行,不会阻塞当前终端的其他操作,用户可以继续输入新的命令或关闭终端窗口而不影响后台任务的执行。例如command &
4. 管道和重走向:
Shell支持使用管道符 | 将一个命令的输出作为另一个命令的输入,实现多个命令之间的数据传递和处理。例如command1|command2 。此外,还可以使用重定向符号>(将输出重定向到文件)、>>(追加输出到文件)、<(从文件读取输入)等来控制命令的输入和输出
5.条件执行:
Shell支持根据条件执行命令。例如,使用if语句判断某个条件是否成立,然后执行相应的命令块。这种方式适合编写复杂的脚本,根据不同情况执行不同的操作
6.函数调用:
在Shell脚本中,可以定义和调用函数。函数是一段封装好的代码块,可以重复使用。通过调用函数,可以使脚本更加模块化和可维护
7.变量和参数传递:
Shell允许定义变量来存储数据和状态,在命令执行过程中使用这些变量。同时,Shell脚本还支持接收和处理命令行参数。这些功能使得Shel脚本可以根据不同的输入和条件执行不同的命令
二、shell脚本的构成
第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如
#!/usr/bin/python、#!/usr/bin/expect
注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
三、编写脚本
1.编写简单的脚本
vim first.sh
#!/bin/bash
cd /opt/
pwd
ls -lh kgc*echo "hello world"
vim first.sh
#!/bin/bash
cd /opt/
echo "当前的目录位于:"
pwdecho "其中以kgc开头的文件包括"
ls -lh kgc*echo "以kgc开头的文件有一个"
2.YUM本地仓库搭建
#!/bin/bash
mount /dev/sr0 /mntcd /etc/yum.repos.d/
mkdir bak
mv *.repo ./bakecho "[local]
name=local
baseurl:file:///mnt
enabled=1
gpgcheck=0" >> /etc/yum.repos.d/local.repoyum repolist
创建 shell 程序的步骤:
第一步:创建一个包含命令和控制结构的文件。
第二步:修改这个文件的权限使它可以执行 # 使用 chmod +x test.sh(你编辑的脚本)
第三步:检测语法错误
第四步:执行 ./first.sh
四、shell脚本执行
shell 脚本的执行通常有以下几种方式
方法一:当前路径(决定路径与相对路径)下执行脚本(要有执行权限)
/home/first.sh 或者 ./first.sh方法二:sh 、bash脚本文件路劲(这种方式可以不对脚本文件添加执行权限)
bash first.sh 或 sh first.sh方法三:source 脚本文件路劲(可以没有执行权限)
source first.sh方法四:其他方法
sh < first.sh 或者 cat first.sh |sh(bash)
五、重定向与管道操作
1.交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误 | /dev/stderr | 2 | 显示器 |
2.重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2.1重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上
重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中>意思是当原来文件中有内容的话,原来的内容会被覆盖掉
>>意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容
uname -p > kernel.txt
#查看结果
cat kernel.txt
uname -r >> kernel.txt#查看结果
cat kernel.txt
2.2重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。 通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用 passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的“--stdin” 选项来识别标准输入)
vim pass.txt
#添加初始密码串内容123456
passwd --stdin wangming < pass.txt
默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台
#以0作为分界符,只要不输入0就会一直输入数据从而显示到屏幕
#可以把输入重定向和输出重定向结合使用,把从屏幕输出的内容保存到文件
2.3错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符
2个作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类输出信息保存到同一个文件
将错误显示的内容和正确显示的内容分开
注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符
&>和>&符号
&表示等同于的意思
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出
/dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失,而尝试从它那儿读取内容则什么也读不到。然而/dev/null对命令行和脚本都非常的有用
解压文件,把出错文件单独拎出来
找一个软件包来演示
解压到指定文件夹
tar zxvf httpd-2.4.25.tar.gz > lisi.txt
cat lisi.txt
3.管道操作
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道
在Shell脚本应用中,管道操作通常用来过滤所需要的关键信息
六、shell脚本变量
1.shell的变量
变量是用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量就可以了
常见Shell变量的类型包括:
自定义变量、环境变量、只读变量、位置变量、预定义变量、交互式定义变量、PATH变量
2.各种变量的应用
2.1自定义变量
变量的定义
Bash中的变量操作相对比较简单,不像其他高级编程语言(如C/C++、Java等)那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可格式:变量名=变量值
变量名:临时存放数据的地方
变量值:临时的可变化的数据等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符
(如+、-、*、/、.、?、%、&、#等)
用echo查看和引用变量的值
通过在变量名称前添加前导符号“$”,可以引用一个变量的值,使用echo命令可以查看变量,可以在一条echo命令中同时查看多个变量值
2.1.1echo选项
echo -n #表示不换行输出
echo -e #输出转义字符,将转义后的内容输出到屏幕上注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用
常用转义字符选项 | 功能 |
\c | 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n |
\n | 换行 |
\t | 转义后表示插入tab,即制表符 |
转义符案例
2.1.2特殊符号的使用
{}可以分割变量值以及序列顺序值
双引号(“”)
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略双引号:可以识别变量,可以直接调用变量
单引号(’)
当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来
在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。输入什么就显示什么,但赋值内容中包含单引号(‘)时,需使用\符号进行转义,以免冲突单引号:不识别变量
反撇号(`)
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量
反撇号括起来的范围内必须是能够执行的命令行,否则将会出错反撇号:赋值时使用反撇号、命令替换、提取命令执行后的输出结果和$()用法相同
2.1.3取消定义
unset 变量名
2.2交互式定义变量
交互式定义变量通常指在一个交互式环境(如命令行、Python解释器、或其他交互式开发工具)中定义和使用变量。在这种环境中,用户可以即时地创建、修改和使用变量,而无需编写和运行完整的脚本或程序
read 命令
除了上述赋值操作以外,还可以使用 Bash 的内置命令read来给变量赋值
用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量
选项 | 功能 |
-p | 提示用户的信息 |
-n | 定义字符数 |
-s | 不显示用户输入的内容,常用于输入密码 read -s -p "input your password:" pass |
-t | 定义超时时间,超过多长时间没输自动退出 |
2.2.1变量的作用范围
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量,当进入子程序或新的子 Shell 环境时,局部变量将无法再使用
2.2.2export命令
为了使用户定义的变量在所有的子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔
env查看用户当前环境变量
2.3环境变量
环境变量指的是出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等
环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变
使用env命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途
RANDOM | 表示随机数,会返回0-32767的整数 |
HOME | 表示用户的宿主目录 |
USER | 表示当前账户的账户名称 |
UID | 表示输出当前用户的用户ID |
PWD | 表示当前所在的工作目录 |
LANG | 表示语言和字符集 |
SHELL | 表示当前用户的默认Shell |
TERM | 表示终端类型 |
2.4PATH变量
用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在 PATH变量指定的目录范围查找对应的可执行文件
如果找不到则会提示“command not found”
2.5只读变量
Shell变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只读变量主要用于变量值不允许被修改的情况,只读变量不可以改变值也不可以被删除
想要继续操作就需要退出登录:exit
2.6位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
命令或脚本本身的名称使用“$0”表示
2.7预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而 不能创建新的预定义变量,也不能直接为预定义变量赋值
预定义变量使用“$”符号和另一个符号组合表示
符号选项 | 功能 |
$# | 表示命令行中位置参数的个数 |
$* | 表示所有位置参数的内容,这些内容当做一个整体 |
$@ | 表示列出所有位置参数,但是是以单个的形式的列出 |
$? | 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常 |
$0 | 表示当前执行的脚本或程序的名称 |
$$ | 表示当前执行的脚本或程序的名称 |
$! | 返回最后一个后台进程的进程号 |
2.7.1理解$*和$@的区别
$*、$@:表示命令或脚本要处理的参数
$*:把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1""$2""$3""$9"
2.7.2总结
$*是将参数全部当做一个整体
$@是将参数每一个都当做单独的个体
七、变量运算
1.数值变量的运算
在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算
整数值的运算主要通过内部命令expr进行
运算符与变量之间必须有至少一个空格
运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
运算符号:$(()) 和$[ ]
运算命令:expr和let
运算工具:bc(系统自带)
2.expr命令
expr命令(不仅可以运算,还支持输出到屏幕)
常用的几种运算符如下所述:
+:加法运算
-:减法运算
\*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符
/:除法运算
%:求余运算,又称为取余运算,用来计算数值相除后的余数