目录
1.1Linux Shell语言的种类非常多,常见的有以下几种。
1.2学编程第一个程序必须是“Hello Word”,我们Shell也是一样,先打印一个再说
喜欢了解的学习的点个关注,后续慢慢出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脚本《四剑客》命令补充https://pan.baidu.com/s/1xw_3AbAQNWWbRonyTHMHhw?pwd=ss8n