shell脚本编程(一)

一、shell脚本编程概述

Linux系统必学的基础操作命令

1.1、shell概述

shell是一种具备特殊功能的程序,提供了用户与内核进行交互操作的一种接口,如下图所示:

登录shell的三种方法:《1》X Window;《2》SSH Secure Shell;《3》Putty。

|--------|-----------------|---------------------------------------------------------|
| 序号 | 编程类型 | 说明 |
| 1 | 编译型语言 | 编写------编译------链接------运行(edit---compile--link---run)。 |
| 1 | 编译型语言 | 常见的编译型语言有:C、C++、Java、C#等。 |
| |||
| 2 | 脚本语言 | 解释器(interpreter)读入脚本程序代码,将其转换成内部的形式执行。 |
| 2 | 脚本语言 | 解释器本身就是编译型程序。 |
| |||
| 3 | shell脚本编程优势 | 语法和结构通常比较简单 |
| 3 | shell脚本编程优势 | 学习和使用通常比较简单 |
| 3 | shell脚本编程优势 | 通常以容易修改程序的"解释"作为运行方式,而不需要"编译"。 |
| 3 | shell脚本编程优势 | 程序的开发产能优于运行效能。 |
[shell脚本编程的优势]

1.2、shell脚本的类型

|--------|----------------|--------------------------------|
| 序号 | shell脚本的类型 | 说明 |
| 1 | 非交互式脚本 | 不需要读取用户的输入,也不用向用户反馈某些信息。 |
| 1 | 非交互式脚本 | 每次执行都是可以预见的,因为它不读取用户输入,参数是固定的。 |
| 1 | 非交互式脚本 | 可以在后台执行。 |
| |||
| 2 | 交互式脚本 | 脚本可以读取用户的输入,实时向用户反馈信息(输出某些信息)。 |
| 2 | 交互式脚本 | 脚本更加灵活,每次执行时的参数都可以由用户动态设定。 |
| 2 | 交互式脚本 | 用户界面更友好,但不适用于自动化任务(如:cron任务)。 |
[shell脚本的类型]

1.3、学习shell编程的前提条件

|--------|----------------------------------------------------------|
| 序号 | 学习shell编程的前提条件 |
| 1 | 掌握一种文本编辑器的使用(如:vi)这是因为Linux系统的配置文件几乎都是纯文本文件。 |
| 2 | 熟悉Linux文件系统的布局。 |
| 3 | 学习shell的各种功能(如:重定向、管道、命令替换、命令聚合)。 |
| 4 | 学习各种管理和监视命令的使用: 《1》用户管理、权限管理、进程管理、包管理。。。 《2》系统监视、网络监视。。。 |
| 5 | 学习各种文本文件工具的使用: 《1》cat、grep、tr、sed、awk... 《2》正则表达式。 |
[学习shell编程的前提条件]

二、shell脚本解析

2.1、shell脚本的格式、编写与执行

|----------------|--------|-------------------------------|-----------------------------------------------------------------------------------|
| shell | 序号 | 内容 | 说明 |
| shell脚本的格式 | 1 | 开头的编译程序 | 第一行:是指定用哪个程序来编译和执行脚本 bash #第一行常见内容(如下面三种) #!/bin/bash #!/bin/sh #!/bin/csh |
| shell脚本的格式 | 2 | 可执行语句 shell控制结构 | 一个shell脚本通常由一组Linux命令、shell命令、控制结构和注释语句构成 |
| shell脚本的格式 | 注意:shell脚本中的注释是以【#】开头,可独占一行,或者直接跟在语句后面(除了第一行的#不是注释外,其余的都是注释) |||
| ||||
| shell脚本的编写 | 序号 | shell脚本的编写 | 说明 |
| shell脚本的编写 | 1 | shell脚本是纯文本文件,可以使用任何文本编辑器编写。 ||
| shell脚本的编写 | 2 | shell脚本通常是以【.sh】作为后缀名。 ||
| ||||
| shell脚本的执行 | 序号 | shell脚本的执行 | 说明 |
| shell脚本的执行 | 1 | 先给执行脚本授权然后执行: bash #给执行脚本授权后执行 chmod +x script_name ./script_name chmod 755 script_name ./script_name ||
| shell脚本的执行 | 2 | 不用授权,直接使用脚本的解释器来执行: bash #不用给脚本授权,直接使用脚本的解释器来执行 bash script_name ||
[shell脚本格式]

2.2、shell脚本的示例及其解析

bash 复制代码
#shell脚本示例一【whologged.sh】
#!/bin/bash

cd                #切换到用户跟目录,因为.bash_profile文件在根目录下
. .bash_profile    #配置用户的命令行环境
date                #显示日期命令
who                #显示当前的登录用户

|--------|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | shell内容 | 说明 |
| 1 | #!/bin/bash | 示例中的第一行是【#!/bin/bash】,其中【#!】符号是shell脚本的起始符号,是指定一个文件类型的特殊标记(它告诉Linux系统这个文件的执行需要指定一个解释器,这个解释器可能是一个shell,也可能是一个程序语言,也可能是一个工具包中的命令程序;这个解释程序从头开始解释并且执行脚本中的命令)。 |
| 2 | 命令(command) | 命令是shell脚本的最基本元素,命令通常由【命令名称】【选项】【参数】三个部分组成,三个部分之间用【空格】或【tab】键分隔。 |
| 2 | 命令(command) | 分号【;】 可以用来隔开同一行内的多条命令,shell会依次执行用分号隔开的多条命令【在前一个命令结束时,而忽略其返回值,继续执行下一个命令】。 bash #分号示例(可实现一行中执行多个命令【如: #进入/data目录中创建testshell目录与shell.txt文件; #之后返回用户当前根目录并打印当前所在目录,且查看当前是哪个用户】): cd /data;mkdir testshell;touch shell.txt;cd;pwd;whoami |
| 2 | 命令(command) | 两and【&&】 在前一个命令结束时,若返回值为true,则继续执行下一个命令。 |
| 2 | 命令(command) | 两竖【||】 在前一个命令结束时,若返回值为false,则继续执行下一个命令。 |
| 2 | 命令(command) | bash #命令行示例: ./test.sh -f config.conf -v --prefix=/home 该示例说明: 《0》【./】表示在当前目录下,执行test.sh脚本,且需要配置如下参数: 《1》【-f】为短选项(是单个字符),它需要一个参数(即:config.conf); 《2》【-v】也是短选项(是单个字符),但它不需要参数; 《3》【--prefix】是一个长选项(即:选项本身多于一个字符,是一个完整的单词,可读性更强),它也需要一个参数,用等号连接。 |
[shell脚本示例解析]

三、正则表达式

3.1、grep命令

|--------|------------|-----------------------------------------------------------------------------------------------------------|
| grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,grep也是Linux中最广泛使用的命令之一 |||
| 序号 | grep命令 | 说明 |
| 1 | grep语法 | grep [选项][模式][文件...] 《1》选项 《2》模式:模式可以是字符串,也可以是变量,还可以是正则表达式【无论模式是何种形式,只要模式中包含空格,就需要使用双引号将模式括起来】。 |
| |||
| grep的选项 |||
| 序号 | grep选项 | 说明 |
| 1 | -c | 只输出匹配行的数量 |
| 2 | -i | 搜索时忽略大小写 |
| 3 | -h | 查询多文件时不显示文件名 |
| 4 | -l | 只列出符合匹配的文件名,而不列出具体匹配行 |
| 5 | -n | 列出所有匹配行,并显示行号 |
| 6 | -s | 不显示不存在或无匹配文件的错误信息 |
| 7 | -v | 显示不包含匹配文本的所有行 |
| 8 | -w | 匹配整词 |
| 9 | -r | 递归搜索,不仅搜索当前工作目录,而且搜索子目录 |
| 10 | -E | 支持扩展的正则表达式 |
| 11 | -F | 不支持正则表达式,按照字符串的字面意思进行匹配 |
[grep命令]

bash 复制代码
#grep命令实例
#0-创建一个文本文件【greptest.txt】
vi greptest.txt
#【greptest.txt】文件内容如下:
this is a test grep demo
coffeemilk is very good
coffee milk coffee milk
test 23456
097
now is 2026-01-06 14:37:36
test abc
test 666

#1-统计匹配【test】字符串的总行数
grep -c test greptest.txt 

#2-找出包含【coffeemilk】字符串的所在行及其整行内容
grep -n coffeemilk greptest.txt

#3-找出不包含【coffeemilk】字符串的所在行及其整行内容
grep -v coffeemilk greptest.txt

#4-找出包含【coffee milk】作为整体的内容所在行及其整行内容
grep -n "coffee milk" greptest.txt 

3.2、grep命令簇

|--------|-------------|------------------------------------------------|
| 序号 | grep命令簇 | 说明 |
| 1 | grep | 标准grep命令,支持基本正则表达式 |
| 2 | egrep | 扩展grep命令,支持基本和扩展正在表达式(与【grep -E】一致)。 |
| 3 | fgrep | 快速grep命令,不支持正则表达式,按照字符串的字面意思进行匹配(与【grep -F】一致) |
[grep命令簇]

3.3、正则表达式的基础

|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 正则表达式的基础 |
| 1 | 正则表达式就是由一系列特殊字符组成的字符串,简称RE(Regular Expression)。 其中每个特殊字符都被称为元字符, 这些元字符并不表示为它们字面上的含义, 而会被解释为一些特定的含义。 |
| 2 | 正则表达式是由普通字符和元字符共同组成的集合, 这个集合用来匹配(或指定)模式。 |
| 3 | 正则表达式的主要功能是文本查询和字符串操作,正则表达式可以匹配文本的一个字符或字符集合。 《1》a、b、c、1、2、3等字符属于普通字符,普通字符可以按照字面意思理解(如:a只能理解为英文的小写字母a,没有其他隐藏含义)。 《2》*、^、[]等元字符,shell赋予了它们超越字面意思的意义(如:*符号的字面意义只是一个符号,而实际上却表示了重复前面的字符0次或多次的隐藏含义)。 |
| ||
| 序号 | 一个正则表达式包含下列一项或多项【^linux*】 |
| 1 | **【一个字符集】**这里所指的字符集只包含普通字符, 这些字符只表示它们的字面含义. 正则表达式的最简单形式就是只包含字符集, 而不包含元字符。 |
| 2 | **【锚】**锚指定了正则表达式所要匹配的文本在文本行中所处的位置(如:^和$就是锚)。 |
| 3 | **【修饰符】**修饰符扩大或缩小(修改)了正则表达式匹配文本的范围;修饰符包含星号, 括号, 和反斜杠。 |
[正则表达式的基础]

|--------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 正则表达式 的元字符 | 说明 |
| 1 | * | 0个或多个在*字符之前那个普通字符 |
| 2 | . | 匹配任意字符 |
| 3 | ^ | 匹配行首,或者后面字符的非 |
| 4 | **** | 匹配行尾 | | 5 | **\[\]** | 匹配字符集合;将匹配中括号字符集中的某一个字符 《1》\[xyz\]将会匹配字符x, 或y, 或z。 《2》\[c-n\]匹配字符c到字符n之间的任意一个字符。 《3》\[B-Pk-y\]匹配从B到P, 或者从k到y之间的任意一个字符。 《4》\[a-z0-9\]匹配任意小写字母或数字。 《5》\[\^b-d\]将会匹配范围在b到d之外的任意一个字符. 这就是使用\^对字符集取反的一个示例。 《6》将多个中括号字符集组合使用, 能够匹配一般的单词或数字: ①"\[Yy\]\[Ee\]\[Ss\]"能够匹配yes, Yes, YES, yEs, 等等。 ②"\[0-9\]\[0-9\]\[0-9\]-\[0-9\]\[0-9\]-\[0-9\]\[0-9\]\[0-9\]\[0-9\]" 可以匹配社保码。 | | 6 | **\\** | 转义符,屏蔽一个元字符的特殊意义 《1》【\\】将会被解释成字符"$"; 《2》 【\\】将会被解释为字符"\",而不是RE中匹配行尾的特殊字符。 |
| 7 | \<\> | 精确匹配符号;用于匹配单词边界,尖括号必须被转义才含有特殊的含义, 否则它就表示尖括号的字面含义 《1》【\<the\>】 完整匹配单词"the", 不会匹配"them", "there", "other"等等。 |
| 8 | \{n\} | 匹配前面字符出现n次 《1》如 cof\{2\}ee 匹配coffee。 |
| 9 | \{n,\} | 匹配前面字符至少出现n次(即:n次及以上) 《1》如 cof\{2,\}ee 匹配coffee、cofffee、coffffee等字符串。 |
| 10 | \{n,m\} | 匹配前面字符出现n次于m此之间 《1》如 cof\{2,6\}ee 匹配coffee、cofffee、coffffee、cofffffee、coffffffee。 |
[正则表达式的元字符]

bash 复制代码
#正则表达式的示例及其解析

#1-*号用于匹配前面一个普通字符的0次或多次重复
hel*o
#*号前面的普通字符是l,*字符就表示匹配l字符0次或多次(如:字符串heo、helo、hello、hellllllo都可以由hel*o来表示)


#2-.号用于匹配任意一个字符
...73.
#表示前面三个字符为任意字符,第4和第5个字符是7和3,最后一个字符为任意字符(如:ckm736、2A67ZC、6ck73n都能匹配上述字符串)


#3-^号用于匹配行首,表示行首的字符是^字符后面的那个字符
^cloud
#表示匹配以cloud开头的行


#4-$符号匹配行尾,$符号放在匹配字符之后
coffeemilk$
#表示匹配以coffeemilk结尾的所有行


#5-【^$】表示空白行
相关推荐
Ha_To1 天前
2026.1.6 Windows磁盘相关
linux·运维·服务器
天码-行空1 天前
【大数据环境安装指南】HBase集群环境搭建教程
大数据·linux·运维·hbase
天空之外1361 天前
生成一个带 IP 的自签证书、制作Http证书
linux·运维·服务器
释怀不想释怀1 天前
linux常见安装(JDK,mysql,nginx)
linux·运维·服务器
杰克崔1 天前
do_exit的hungtask问题及coredump的实验及原理分析一
linux·运维·服务器·车载系统
pengdott1 天前
Linux进程数据结构与组织方式深度解析
linux·运维·服务器
Java 码农1 天前
gitlab gitrunner springboot 多环境多分支部署 (非容器方式,使用原生linux 环境)
linux·spring boot·gitlab
LongQ30ZZ1 天前
Linux的常见指令
linux·服务器
走向IT1 天前
vdbench在Centos系统上联机测试环境搭建
linux·运维·centos