shell脚本编程(二)

shell脚本编程(一)https://coffeemilk.blog.csdn.net/article/details/156617455

一、正则表达式内容

1.1、正则表达式扩展

|--------|-----------------|-------------------------------------------------|
| awk和Perl等Linux工具还支持正则表达式扩展出来的一些元字符,用于egrep, awk, 和Perl.这些元字符如下表所示: |||
| 序号 | 正则表达式的扩展元字符 | 说明 |
| 1 | ? | 匹配0个或1个在其之前的那个普通字符, 通常用来匹配单个字符。 |
| 2 | + | 匹配1个或多个在其之前的那个普通字符。与前面讲的*号作用类似, 但是不能匹配0个字符的情况。 |
| 3 | () | 括起一组正则表达式. 表示一个字符集合或用在expr中。 |
| 4 | | | 或"操作符, 使用它能够匹配一组可选字符中的任意一个。 |
[正则表达式扩展]

bash 复制代码
#正则表达式扩展示例

#1-【?示例】匹配0个或1个在其之前的那个普通字符(f)
grep -E ^cof? greptest.txt

#2-【+示例】匹配1个或多个在其之前的那个普通字符(f)不能匹配0个字符的情况
grep -E ^cof+ greptest.txt

1.2、POSIX字符类

为了保持不同国家的字符编码一致性,POSIX(Portabel Operating System Interface)增加了特殊的字符类,以[:classname]的格式给出,grep命令支持POSIX字符类。POSIX字符类通常都要用引号或双中括号([[]])引起来。

|--------|---------------------------------------|--------------------------|
| 序号 | POSIX字符 | 说明 |
| 1 | [:upper:] | 表示大写字母【A-Z】 |
| 2 | [:lower:] | 表示小写字母【a-z】 |
| 3 | [:digit:] | 表示阿拉伯数字【0-9】 |
| 4 | [:alnum:] | 表示大小写字母和阿拉伯数字【0-9a-zA-Z】 |
| 5 | [:space:] | 表示空格或tab键 |
| 6 | [:alpha:] | 表示大小写字母【a-zA-Z】 |
| 7 | [:cntrl:] | 表示Ctrl键 |
| 8 | [:graph:] [:print:] | 表示ASCII码33-126之间的字符 |
| 9 | [:xdigit:] | 表示16进制数字【0-9A-Fa-f】 |
[POSIX字符类]

bash 复制代码
#POSIX字符示例

#1-获取所有包含阿拉伯数字的内容
grep -E [[:digit:]] greptest.txt

1.3、通配符

|--------|-----------------------------------------------------------|
| 序号 | 通配解析 |
| 1 | 通配(globbing)是把一个包含通配符的非具体文件名扩展到存储在计算机、服务器或者网络上的一批具体文件名的过程 |
| 2 | 最常用的通配符包括正则表达式元字符:?、*、[]、{}、^等,通配符与元字符意义不完全相同,如下表所示: |
| 1 | *号 不再表示其前面字符的重复,而是表示任意位的任意字符。 |
| 2 | ?符表示一位的任意字符。 |
| 3 | ^号在通配中不代表行首,而是代表取反。 |
[通配符]

bash 复制代码
#通配符的示例
#1-列出当前目录下所有以.sh结尾的文件
ls *.sh

#2-列出当前目录下所有以【mytest】开头且后面还有一位任意字符且以.sh结尾的所有文件
ls mytest?.sh

#3-列出当前目录下以字符b或e开头,且以.sh结尾的所有文件
ls [be]*.sh

#4-列出当前目录下以字符e或m开头,且不是.sh结尾的所有文件
ls [em]*.[^sh]*

#5-列出当前目录下以所有小写字符【a-z】开头,且以.sh结尾的所有文件
ls [a-z]*.sh

#6-在当前目录下创建以字符a开头,后面跟上数字1或2,且数字后是linux的目录
mkdir a{1,2}linux

#7-在当前目录下创建以字符a开头,后面跟上数字11或22或33或44,且数字后是linux的目录
mkdir a{11,22,33,44}linux

#8-在当前目录下创建以字符a开头,后面跟上数字5至9,且数字后是linux的目录
mkdir a{5..9}linux

二、shell编程中的变量

2.1、变量的定义与分类

变量用于保存有用信息(如:路径名、文件名、数字等),Linux用户使用变量定制其工作环境,使系统获知用户相关的配置。

变量本质上是存储数据的一个或多个计算机内存地址。

|--------|----------------------------------------|----------------------------------------------------------|
| 序号 | 变量的分类 | 说明 |
| 1 | 用户自定义变量 myname | 由用户自己定义、修改和使用。 |
| 2 | shell环境变量 PATH | 由系统维护,用于设置用户的shell工作环境。 只有少数的变量用户可以修改其值。 一个明显特征是:全是大写字母。 |
| 3 | 位置参数变量(Positional Parameters)1 2 | 通过命令行给程序传递执行参数。 可用 shift 命令实现位置参数的迁移。 |
| 4 | 内部参数变量(Special Parameters)# ? | Bash 预定义的特殊变量。 用户不能修改其值。 |
[变量的分类]

2.2、shell变量操作

|--------|---------------|--------------------------------------------------------------------------------|
| 序号 | shell变量操作 | 说明 |
| 1 | 输入 | 变量赋值: bash #变量赋值 name=value readonly 从标准输入读取: bash #从标准输入读取 read |
| 2 | 输出 | bash #输出 echo printf |
| 3 | 变量替换 | 变量测试。 变量的字符串操作。 变量的间接引用。 |
| 4 | 变量的数值计算 | bash #变量的数值计算 $[expression] $((expression)) declare -i |
[shell变量操作]

2.3、变量赋值

|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 变量赋值说明 |
| 1 | 变量是某个值的名称,引用变量值就称为变量替换。 |
| 2 | 符号是变量的替换符号(如:【variable】是变量名,那么【variable】就表示变量的值)。 |
| 3 | 变量赋值有两种格式 bash #变量赋值的两种格式 #变量赋值格式一 variable=value #变量赋值格式二 variable=`command argument` 注意: 1、变量赋值的等号两边不能有空格! 2、若值(value)中包含空格,则必须用双引号括起来,没有空格时也可以用引号,效果与不用一致。 3、变量名只能是大小写字母(A-Z和a-z)、数字(0-9)、下划线(_)等符号,并且变量名不能以数字开头,否则视为无效变量名;变量名还严格区分大小写! |
[变量赋值]

bash 复制代码
#定义变量并打印测试

#1-定义myname变量并赋值【coffeemilk】,最后使用echo打印变量内容
myname=coffeemilk
echo $myname

#2-定义myname2变量并赋值【coffee milk】,最后使用echo打印变量内容
myname2="coffee milk"
echo $myname2

#3-定义myname3变量并赋值【coffee milk is a    developer】,最后使用echo打印变量内容
myname3="coffee milk is a    developer"
echo $myname3
echo "$myname3"

2.4、变量声明和使用

|--------|-------------------------------------------------------------------------------------------|
| 序号 | 变量的声明和使用 |
| 1 | 变量是弱类型(不用声明类型)。 |
| 2 | 变量声明及赋值格式 bash #变量声明及其赋值格式如下(注意:等号两边不能有空格) 变量=值 |
| 3 | 变量的引用 bash #变量的引用 $变量名 ${变量名} 注意: 1、变量名为一个字符时建议使用【变量名】; 2、多于一个字符时建议使用【{变量名}】 |
[变量的声明和使用]

bash 复制代码
#变量的声明与使用示例
#1-编辑一个shell脚本
vi testvar.sh
#【testvar.sh】的内容如下
#!/bin/bash
url="coffeemilk.blog.csdn.net"
desc="牛奶咖啡的个人博客"

echo "输出方式一:$desc_$url"
echo "输出方式二:${desc}_${url}"


#2-运行shell脚本
bash testvar.sh

2.5、echo命令

|--------|------------------------------------------------------------------------------------------|
| 序号 | echo命令说明 |
| 1 | echo命令功能:显示文字 |
| 2 | bash #echo语法 echo [-ne][字符串] **注意:**echo会将输入的字符串送往标准输出(输出的字符串间以空白字符隔开, 并在最后加上换行号) |
| 3 | echo的参数: 《1》【-n】不进行换行; 《2》【-e】正常将内容输出,但特殊字符(如【\n】表示换行;【\\】表示转义)。 |
[echo命令]

2.6、变量的清除和只读

|--------|----------|---------------------------------------------------------------------------|
| 序号 | 命令 | 说明 |
| 1 | unset | 可以清除命令 bash #清除变量的语法 unset 变量名 |
| 2 | readonly | 可以将变量设置为只读,变量一旦设置为只读,任何用户不能对此变量重新赋值 bash #设置变量为只读 变量=值 readonly 变量 |
[变量的清除和只读]

2.7、无类型的shell脚本变量

|--------|--------------------------------------------------------------------------------------------------------------|
| 序号 | 无类型的shell脚本变量 |
| 1 | shell脚本变量是无类型的,这与awk变量是一样的 |
| 2 | bash shell不支持浮点型,只支持整型和字符型,默认情况下,shell脚本变量是字符型的,同时,字符型的变量还具有一个整型值,为0; 但是,bash Shell并不要求在定义一个变量时声明其类型 |
| 3 | shell会根据上下文判断出数值型的变量,并进行变量的算术运算和比较等数值操作。 判断标准是变量中是否只是包含数字,如果变量只包含数字,则Shell认定该变量是数值型的,反之,shell认定该变量是字符串 |
[无类型的shell脚本变量]

三、shell编程中的引用

**shell编程中的引用是指:**将字符串用引用符号括起来,以防止特殊字符被shell脚本重解释为其他含义。

**特殊字符是指:**除了字面意思之外还可以解释为其他意思的字符。

|--------|---------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 符号 | 名称 | 说明 |
| 1 | " " | 双引号 | 引用除【美元符号()】、【反引号(\`)】和【反斜线(\\)】之外的所有字符(即: ` \在双引号中仍被解释为特殊意义)。 variable与加双引号"variable"的区别: 《1》variable:将variable的值输出,但是不会讲variable中含有空格的字符串看作是一个整体输出。 《2》"variable":会把variable的值完整输出,包含空格一起输出。 用双引号引用变量能够防止字符串分割,保留变量中的空格 |
| 2 | ' ' | 单引号 | 引用所有字符。 《1》单引号引用了所有字符(即:单引号中字符除单引号本身之外都解释为字面意义,单引号不再具备引用变量的功能)。 《2》通常将单引号的引用方式称为全引用,将双引号的引用方式称为部分引用。 bash #变量的写法【$variable】【${variable}】 #【$variable】实际上只是【${variable}】的简写形式, #在某些上下文中$variable可能会引起错误,这个时候就需要使用${variable}了, #加上花括号是为了帮助解释器识别变量的边界 #【建议给所有变量加上花括号,这是个好习惯,既便于阅读,又不易出错】 |
| 3 | · · | 反引号 | shell将反引号中的内容解释为系统命令 |
| 4 | \ | 反斜线 | 转义符,屏蔽下一个字符的特殊意义。 |
[引用符号]

bash 复制代码
#引用示例
#1-定义变量myname然后赋值为coffeemilk
myname=coffeemilk

#2-使用双引号引用变量myname输出的结果是变量的值
echo "$myname"

#3-使用单引号包住变量myname输出的结果是除单引号外的字符
echo '$myname'
echo '$myname \\ ?'

#4-使用反引号引用系统命令并显示
echo `netstat -antlp`
echo `ps -ef`

#5-使用反引号引用系统命令给变量activetcp赋值,并显示出来
activetcp=`netstat -antlp`
echo "$activetcp"
相关推荐
xiaoliuliu1234516 小时前
xampp-linux-1.8.1.tar.gz 怎么安装?Linux下XAMPP离线安装完整步骤
linux·运维·服务器
用户61354114601616 小时前
xampp-linux-1.8.1.tar.gz 怎么安装?Linux下XAMPP离线安装完整步骤
linux
qq_3985865417 小时前
Debian12远程方案xrdp、kasmvnc、novnc
linux·debian·rdp·novnc·kasmvnc
Dovis(誓平步青云)17 小时前
《Linux 核心 IO 模型深析(中篇):探索Cmake与多路转接的高效实现poll》
linux·运维·服务器·数据库·csdn成长记录
Java 码农17 小时前
RabbitMQ集群部署方案及配置指南01
linux·服务器·rabbitmq
郝学胜-神的一滴17 小时前
深入理解Linux中的Try锁机制
linux·服务器·开发语言·c++·程序人生
sim202017 小时前
把etcd分区挂到SSD盘
linux·etcd
EndingCoder17 小时前
函数基础:参数和返回类型
linux·前端·ubuntu·typescript
CAU界编程小白17 小时前
Linux系统编程系列之动静态库
linux