00-Shell脚本介绍

目录

前言

一、Shell入门

1.1Linux Shell语言的种类非常多,常见的有以下几种。

1.2学编程第一个程序必须是“Hello Word”,我们Shell也是一样,先打印一个再说

1.3Shell脚本编程需要注意以下事项

二、Shell编程

2.1变量详解

2.2系统变量

2.3环境变量

2.4符号详解

三、Shell编程“四剑客”

3.1find

3.2 sed

3.3 awk

3.4 grep


喜欢了解的学习的点个关注,后续慢慢出Shell高级企业实战脚本命令

前言

说到Shell编程,学过Linux或者从事过网管/网工的朋友应该不陌生,在学习Shell语言的时候很多同学前几天会觉得,哎呀怎么这么难,其实只要同学们多学几次慢慢就会发现,Shell语言是所有编程里最容易上手的,也是最容易学习的编程之一(好比python)。

本章节就先讲解一下Shell编程基础知识点

一、Shell入门
1.1Linux Shell语言的种类非常多,常见的有以下几种。
(1)Bourne Shell(/usr/bin/sh或/bin/sh)。
(2)Bourne Again Shell(/bin/bash)。
(3)C Shell(/usr/bin/csh)。
(4)K Shell(/usr/bin/ksh)。
(5)Shell for Root(/sbin/sh)。

不同的Shell语言的语法有所不同,一般不能交换使用。最常用的Shell语言是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。
Shell、Shell编程、Shell脚本、Shell命令之间有什么区别呢?

简单来说,Shell是一个整体的概念,Shell脚本内置Shell命令,Shell命令则是Shell编程底层具体的语句和实现方法。

图1.kernel和Shell关系

1.2学编程第一个程序必须是“Hello Word”,我们Shell也是一样,先打印一个再说

我们打开Centos控制台,进入脚本名称为myscript.sh里配置

vim myscript.sh
#!/bin/bash                 //固定格式,定义脚本所在使用的Shell类型
#This is my First Shell    //#表示注释,没有任何意义,shell不会编译他
#By author cyly 2023        //表示脚本的创建人
echo "Hello Word!"        //shell脚本主命令,执行该脚本的内容

我们要运行这个程序并打印出来,就要给权限,我们要用到  chmod 来附加权限

chmod o+x myscript.sh

然后你就可以直接运行脚本:

./myscript.sh

运行效果

1.3Shell脚本编程需要注意以下事项
(1)Shell脚本名称中的英文区分大小写。
(2)不能使用特殊符号、空格命名。
(3)Shell脚本以.sh结尾。
(4)不建议Shell命名为纯数字,一般以脚本功能命名。
(5)Shell脚本内容首行需以“#!/bin/bash”开头。
(6)Shell脚本中变量名称尽量使用大写字母,字母间不能使用“-”,可以使用“_”。
(7)Shell脚本变量名称不能以数字、特殊符号开头。
二、Shell编程
2.1变量详解

Shell是非类型的解释型语言,不像C++、Java语言编程时需要事先声明变量,Shell给一个变量赋值,实际上就是定义了变量,在Linux支持的所有Shell中,都可以用赋值符号(=)为变量赋值。Shell变量为弱类型,定义变量不需要声明类型,但在使用时需要明确变量的类型。可以使用Declare指定类型,Declare常见的参数有以下几个:

+/-        #‘+’为取消变量所设的属性,‘-’可以用来指定变量的属性
-f         #仅显示函数
r          #将变量设为只读
x          #指定的变量会成为环境变量,可供Shell以外的程序使用
i          #指定类型为数值,字符串或运算符

Shell编程中变量分为3种,分别是系统变量、环境变量和用户变量。Shell变量名在定义时,首字符必须为字母(a~z,A~Z),不能以数字开头,中间不能有空格,可以使用下画线(_),不能使用半字线(-),也不能使用标点符号等。
例如,定义变量A=jfedu.net,其中A为变量名,jfedu.net是变量的值。变量名有格式规范,变量的值可以随意指定。变量定义完成后,如需引用变量,可以使用$A。

2.2系统变量

Shell常见的变量之一为系统变量,主要用于对参数判断和命令返回值判断。系统变量详解如下:

$$ #程序本身的PID号
$n #当前脚本的第n个参数,n=1,2,…,9
$# #当前脚本的参数个数(不包括程序本身)
$* #当前脚本的所有参数(不包括程序本身)
$0 #当前脚本的名称
$? #命令或程序执行完后的状态,返回0表示执行成功
2.3环境变量

Shell常见的变量之二为环境变量,主要是在程序运行时设置。环境变量详解如下:

HOSTNAME #显示当前主机名
PWD #显示当前所在路径
USER #打印当前用户名
HOME #打印用户主目录
TERM #打印当前终端类型
ID #打印当前用户ID信息
SHELL #显示当前Shell类型
PATH #命令所示路径,以冒号分隔
2.4符号详解

Shell编程中,使用变量、编程时,经常会使用变量前导符、反斜杠、单引号、双引号、反引号等符号,如下为几种符号的简单对比。

(1)使用变量前导符($),主要用于引用Shell编程中的变量,例如定义变量JF=www.jfedu.net,引用值需要用$JF。
(2)反斜杠(\)主要用于对特定的字符实现转义,保留原有意义,例如echo "\$JF"结果会打印$JF,而不会打印www.jfedu.net。
(3)单引号(' '),又称为强引,不具有变量置换的功能,使任意字符还原为字面意义,可实现屏蔽Shell元字符的功能。
(4)双引号(" "),又称为弱引,具有变量置换的功能,保留$(使用变量前导符)、\(转义符)、`(反向引号)元字符的功能。
(5)反引号(` `),位于键盘Tab键上面一行的键,用作命令替换(相当于$(…))
三、Shell编程“四剑客”

在Shell编程工具中,“四剑客”工具的使用更加广泛。Shell编程“四剑客”包括find、sed、grep和awk。熟练掌握“四剑客”会使Shell编程能力得到极大的提升。

3.1find

find工具主要用于操作系统文件和目录的查找,语法如下

find path -option [-print] [-exec -ok command] { } \;

其中option常用的参数

-name   filename    		#查找名为filename的文件
-type    b/d/c/p/l/f		#查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]     		#查长度为n块[或n字节]的文件
-perm               		#按执行权限查找
-user    username   		#按文件属主查找
-group   groupname  		#按组查找
-mtime    -n +n     		#按文件更改时间查找文件,-n指n天以内,+n指n天以前
-atime    -n +n     		#按文件访问时间查找文件
-ctime    -n +n     		#按文件创建时间查找文件
-mmin     -n +n     		#按文件更改时间查找文件,-n指n min以内,+n指n min以前
-amin     -n +n     		#按文件访问时间查找文件
-cmin     -n +n     		#按文件创建时间查找文件
-nogroup            		#查无有效属组的文件
-nouser             		#查无有效属主的文件
-newer   f1 !f2     		#找文件,-n指n天以内,+n指n天以前
-depth              		#使查找在进入子目录前先行查找完本目录
-fstype             		#查更改时间比f1新但比f2旧的文件
-mount              		#查文件时不跨越文件系统mount点
-follow             		#如果遇到符号链接文件,就跟踪链接所指的文件
-cpio              			#查位于某一类型文件系统中的文件
-prune              		#忽略某个目录
-maxdepth					#查找目录级别深度

(1)find工具-type参数案例如下:

find   /data/    -type d   					#查找/data/目录下的文件夹
find   /data/    !   -type   d    			#查找/data/目录下的非文件夹
find   /data/    -type l   					#查找/data/目录下的链接文件
find  /data/ -type d|xargs chmod 755 –R		#查目录类型并将权限设置为755
find  /data/ -type f|xargs chmod 644 –R		#查文件类型并将权限设置为644

(2)find工具-size参数案例如下:

find   /data/    -size   +1M           	#查找大于1MB的文件
find   /data/    -size   10M            #查找大小为10MB的文件
find   /data/    -size   -1M            #查找小于1MB的文件

(3)find工具-perm参数案例如下:

find   /data/    -perm   755   			#查找/data/目录权限为755的文件或目录
find   /data/    -perm   -007   		#与-perm 777相同,表示所有权限
find   /data/    -perm   +644         	#文件权限符号644以上

(4)find工具-mtime参数案例如下:

atime,access time 				 			#文件被读取或者执行的时间
ctime,change time  							#文件状态改变时间
mtime,modify time  							#文件内容被修改的时间
find /data/ -mtime +30 	-name 	"*.log"		#查找30天以前的log文件
find /data/ -mtime -30 	-name 	"*.txt"		#查找30天以内的log文件
find /data/ -mtime 30 	-name  	"*.txt"		#查找第30天的log文件
find /data/ -mmin  +30	-name  	"*.log"   	#查找30min以前修改的log文件
find /data/ -amin  -30 	-name  	"*.txt"  	#查找30min以内被访问的log文件
find /data/ -cmin  30 	-name  	"*.txt"		#查找第30min改变的log文件

(5)find工具参数综合案例如下:

#查找/data目录以.log结尾,文件大于10KB的文件,同时复制到/tmp目录
find /data/ -name "*.log"  –type f  -size +10k -exec cp {} /tmp/ \;
#查找/data目录以.txt结尾,文件大于10KB的文件,权限为644并删除该文件
find /data/ -name "*.log"  –type f  -size +10k  -m perm 644 -exec rm –rf {} \;
#查找/data目录以.log结尾、30天以前的、大于10MB的文件并移动到/tmp目录
find /data/ -name "*.log"  –type f  -mtime +30 –size +10M -exec mv {} /tmp/ \;
3.2 sed

sed是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至可以来自管道的文本。与VIM编辑器类似,它一次处理一行内容,可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间(pattern space)”,紧接着用sed命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或写入文件。逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非使用重定向存储输出或写入文件。

sed    [-Options]     ['Commands']    filename;
#sed工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加-i参
#数对文件彻底修改
x                   			#x为指定行号
x,y                 			#指定从x到y的行号范围
/pattern/           			#查询包含模式的行
/pattern/pattern/   		#查询包含两个模式的行
/pattern/,x         			#从与pattern的匹配行到x号行之间的行
x,/pattern/         			#从x号行到与pattern的匹配行之间的行
x,y!                			#查询不包括x和y行号的行
r                				#从另一个文件中读文件
w                				#将文本写入到一个文件
y                				#变换字符
q             				#第一个模式匹配完成后退出
l                				#显示与八进制ASCII码等价的控制字符
{}              				#在定位行执行的命令组
p                				#打印匹配行
=                				#打印文件行号
a\              				#在定位行号之后追加文本信息
i\              				#在定位行号之前插入文本信息
d                				#删除定位行
c\              				#用新文本替换定位文本
s                				#使用替换模式替换相应模式
n                				#读取下一个输入行,用下一个命令处理新的行
N                           	#将当前读入行的下一行读取到当前模式空间
h                				#将模式缓冲区的文本复制到保持缓冲区
H                				#将模式缓冲区的文本追加到保持缓冲区
x                				#互换模式缓冲区和保持缓冲区的内容
g                				#将保持缓冲区的内容复制到模式缓冲区
G                				#将保持缓冲区的内容追加到模式缓冲区

常用sed工具企业演练案例如下。

(1)替换jfedu.txt文本中的old为new。

sed    's/old/new/g'       cyly.txt   #cyly是我UP名

(2)打印jfedu.txt文本中的第1~3行。

sed    -n  '1,3p'           cyly.txt

(3)删除jfedu.txt第1~3行,删除匹配行至最后一行。

sed       '1,3d'             cyly.txt
sed       '/jfedu/,$d'      cyly.txt
3.3 awk

awk是一个优良的文本处理工具,是Linux及UNIX环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名。awk是一个行级文本高效处理工具。awk经过改进生成的新的版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是awk的GNU开源免费版本。

awk的基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤;如果找不到匹配内容,则继续处理下一行。

awk    'pattern   +   {action}'     file

(1)awk基本语法参数详解。

① 单引号' '是为了和Shell命令区分开。
② 大括号{ }表示一个命令分组。
③ pattern是一个过滤器,表示匹配pattern条件的行才进行action处理。
④ action是处理动作,常见动作为print。
⑤ 使用#作为注释,pattern和action可以只有其一,但不能二者都没有。

(2)awk内置变量详解。

FS									#分隔符,默认是空格
OFS									#输出分隔符
NR									#当前行数,从1开始
NF									#当前记录字段个数
$0									#当前记录
$1~$n								#当前记录第n个字段(列)

(3)awk内置函数详解。

gsub(r,s) 							#在$0中用s代替r
index(s,t) 							#返回s中t的第一个位置
length(s) 							#s的长度
match(s,r) 							#s是否匹配r
split(s,a,fs) 						#在fs上将s分成序列a
substr(s,p)							#返回s从p开始的子串

(4)awk常用操作符、运算符及判断符详解。

++ --                   				#增加与减少(前置或后置)
^ **                    				#指数(右结合性)
! + -                   				#非、一元(unary) 加号、一元减号
+ - * / %                   			#加、减、乘、除、余数
< <= == != > >=  					    #数字比较
&&                     				    #逻辑and
||                    					#逻辑or
= += -= *= /= %= ^= **= 			    #赋值

(5)awk与流程控制语句。

if(condition) { } else { }
while { }
do{ }while(condition)
for(init;condition;step){ }
break/continue

常用awk工具企业演练案例如下。

(1)awk打印硬盘设备名称,默认以空格分隔。

df    -h|awk  '{print  $1}'

(2)awk以空格、冒号、\t、分号分隔。

awk  -F '[ :\t;]'  '{print  $1}'         		cyly.txt
3.4 grep

全面搜索正则表达式(Global search Regular Expression and Print out the line,GREP)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

目前Linux操作系统默认使用GNU版本的grep。它的功能更强,可以通过-G、-E、-F命令行选项使用egrep和fgrep的功能。其语法格式及常用参数详解如下:

grep     -[acinv]    'word'     Filename

grep常用参数详解如下:

-a 						#以文本文件方式搜索
-c 						#计算找到符合行的次数
-i 						#忽略大小写
-n 						#顺便输出行号
-v 						#反向选择,即显示不包含匹配文本的所有行
-h 						#查询多文件时不显示文件名
-l 						#查询多文件时只输出包含匹配字符的文件名
-s 						#不显示不存在或无匹配文本的错误信息
-E 						#允许使用egrep扩展模式匹配

通配符类型详解如下:

*						#0个或者多个字符、数字
?						#匹配任意一个字符
#						#表示注解
|						#管道符号
;						#多个命令连续执行
&						#后台运行指令
!						#逻辑运算非
[ ]						#内容范围,匹配括号中的内容
{ }						#命令块,多个命令匹配

正则表达式详解如下:

*								#前一个字符匹配0次或多次
.								#匹配除了换行符以外任意一个字符
.*								#代表任意字符
^								#匹配行首,即以某个字符开头
$								#匹配行尾,即以某个字符结尾
\(..\) 							#标记匹配字符
[]								#匹配中括号里的任意指定字符,但只匹配一个字符
[^]								#匹配除中括号以外的任意一个字符
\								#转义符,取消特殊含义
\< 								#锚定单词的开始
\> 								#锚定单词的结束
{n}								#匹配字符出现n次
{n,}							#匹配字符出现大于等于n次
{n,m}							#匹配字符至少出现n次,最多出现m次
\w 								#匹配文字和数字字符
\W 								#\w的反置形式,匹配一个或多个非单词字符
\b 								#单词锁定符
\s								#匹配任何空白字符
\d								#匹配一个数字字符,等价于[0-9]

常用grep工具企业演练案例如下:

grep  -c "test" 	   	cyly.txt		#统计test字符总行数
grep  -i "TEST" 	   	cyly.txt	    #不区分大小写查找test所有的行
grep  -n "test" 	   	cyly.txt		#打印test的行及行号
grep  -v "test" 	  	cyly.txt		#不打印test的行
grep  "test[53]" 	cyly.txt		    #以字符test开头,接5或3的行
grep  "^[^test]" 	cyly.txt		    #显示输出行首不是test的行
grep  "[Mm]ay" 	 	cyly.txt		    #匹配以M或m开头的行
grep  "K…D" 		cyly.txt	        #匹配K,3个任意字符,紧接D的行
grep  "[A-Z][9]D"  	cyly.txt		    #匹配大写字母,紧跟9D的字符行
grep  "T\{2,\}" 	   	cyly.txt		#打印字符T字符连续出现2次以上的行
grep  "T\{4,6\}" 	cyly.txt		    #打印字符T字符连续出现4次及6次的行
grep  -n "^$" 	 	cyly.txt		    #打印空行的所在的行号
grep  -vE "#|^$"  	cyly.txt 		    #不匹配文件中的#和空行
grep   --color -ra -E "db|config|sql"  *	#匹配包含db或config或sql的文件
grep   --color -E "\<([0-9]{1,3}\.){3}([0-9]{1,3})\>" 	#cyly.txt 匹配
															#IPv4地址

好了,目前就讲这么多,还有很多命令详解请点击下列连接详细查看

shell脚本《四剑客》命令补充icon-default.png?t=N7T8https://pan.baidu.com/s/1xw_3AbAQNWWbRonyTHMHhw?pwd=ss8n

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网运_沉鱼落雁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值