千家信息网

我的朗科运维第七课

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,shell脚本编程在讲shell脚本编程前,先了解一下bash的颜色显示规则:bash的颜色显示规则是按照ASCII编码对颜色进行设置的;其一些常用的编码有:\033:Ctrl键;[:控制颜色属性命令
千家信息网最后更新 2026年10月31日我的朗科运维第七课

shell脚本编程

在讲shell脚本编程前,先了解一下bash的颜色显示规则:

bash的颜色显示规则是按照ASCII编码对颜色进行设置的;其一些常用的编码有:

\033:Ctrl键;

[:控制颜色属性命令;

0m:关闭颜色属性命令;

1m:加粗显示文本字符;

4m:为文本字符加下划线标识;

5m:使文本字符闪烁;

7m:将文本字符的背景色和前景色交换显示;

8m:将文本字符的背景色和前景色设置为相同颜色;

30m-39m:设置文本字符的前景色;38m和39m暂时保留;

40m-49m:设置文本字符的本景色;48m和49m暂时保留;

例子:echo -e "\033[5;37mhello world\033[0m" #显示×××的闪烁的hello world

在Linux中一个完整的Linux程序,一般包括4类文件:

二进制文件(可执行文件)、头和库文件、帮助文件、配置文件

其中bash--CLI(命令行接口)的一种,属于完整的应用程序,也有这四类文件;

bash的配置文件分为一下三类:

profile类:为交互式登陆的shell进程实现功能出事化的配置文件;

bashrc类:为非交互式登陆的shell进程实现功能配置的文件;

logout类:为交互式登陆的shell进程提供终止及清理类功能的配置文件;

shell的类型:

交互式登陆的shell:

1.直接通过某个终端输入账号和密码后登陆打开的shell进程;

2.使用su - USERNAME 或su - USERNAME 执行切换登陆打开的shell进程;

非交互式登陆的shell:

1.在图形界面下,透过菜单或右键菜单打开的终端的shell进程;

2.使用su USERNAME执行切换登陆打开的shell进程;

bash的配置文件:

profile类:

全局:对所有用户都生效的配置;其目录为:/etc/profile、/etc/profile.d/*.sh

注意:在RHEL或CentOS系列的操作系统中,通常情况下,如果一个配置文件内容很多,格式复杂,我们会将其切割成多个片段,将切割出来的片段统一的存放在"程序名称.d"目录中;在这样目录中所保存的片段文件,大多以统一的文件后缀名来命令;

用户个人:仅仅只是针对某个用户有效的配置文件;其目录:~/.bash_profile

profile类配置的文件的作用:

1.用于定义用户的环境变量;

2.用于运行脚本或执行命令;

bashrc类:

全局:/etc/bashrc

用户个人:/.bashrc

bashlrc类配置的文件的作用:

1.用户定义本地变量

2.用户定义命令的别名;

3.定义umask;

注意:只有超级用户root可以修改全局类的配置文件;普通用户只能修改其家目录中的个人配置文件;

交互式登陆的shell进程,会按照顺序加载下列配置文件:

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登陆的shell进程,会按照顺序加载下列配置文件:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

所有在命令行中执行的命令的操作,只要没涉及到文件的修改的,一般都只是针对当前的shell生命周期有效;只要shell进程结束,所有的设置均失效;

配置文件的作用;使得我们赖以生存的配置信息可以长期有效,只要不修改配置文件中的内容,每一次打开shell都会使曾经的配置生效;

让配置文件中新定义的配置能够立即生效的方式:

1.source命令:

格式:source /PATH/TO/SOME_CONF_FILES

. /PATH/TO/SOME_CONF_FILES

2.exec命令:

格式:exec /PATH/TO/SIME_CONF_FILES

bash中变量中存放的字符串处理方式:

弱变量:

1.无需事先定义即可使用;

2.没有变量数据类型的硬性要求,默认是字符行;

1.字符串切片:

${#VAR}:返回字符串类型的变量VAR的长度;

${VAR:offset}:返回字符串变量VAR中第offset个字符后面的内容,不包括第offset个字符;offset的取值范围为:0~$[${#VAR}-1]

${VAR:offset:number}:返回字符串变量VAR中从第offset个字符后开始,长度为number的字符部分;

${VAR: -length}:取字符串最右测的length个字符;

2.基于模式取字符串:

${VAR#*PATTERN}:自左而右,查找VAR变量所存储的字符串中,第一次被PATTERN匹配的字符,删除从字符串开始到PATTERN匹配的字符之间的所有字符;

${VAR##*PATTERN}:自左而右,查找VAR变量所存储的字符串中,所有被PATTERN匹配的字符,删除从字符串开始到最后一个PATTERN匹配的字符之间的所有字符;

${VAR%PATTERN*}:自右而左,查找VAR变量所存储的字符串中,第一次被PATTERN匹配的字符,删除从字符串结尾到PATTERN匹配的字符之间的所有字符;

${VAR%%PATTERN*}:自右而左,查找VAR变量所存储的字符串中,第一次被PATTERN匹配的字符,删除字符串结尾到最后一个PATTERN匹配的字符之间的所有字符;

3.查找替换:

${VAR/PATTERN/SUBSTRING}:在VAR变量中查找匹配PATTERN的内容,将其第一个匹配的结果更换成SUBSTRING;

${VAR//PATTERN/SUBSTRING}:在VAR变量中查找匹配PATTERN的内容,将其所有匹配到的结果都更换成SUBSTRING;

${VAR/#PATTERN/SUBSTRING}:在VAR变量中查找行首匹配PATTERN的内容,将匹配的结果更换成SUBSTRING;

${VAR/%PATTERN/SUBSTRING}:在VAR变量中查找行尾匹配PATTERN的内容,将匹配的结果更换成SUBSTRING;

4.查找删除:

${VAR/PATTERN}:在VAR变量中查找匹配PATTERN的内容,将其第一个匹配到的结果删除;

${VAR//PATTERN}:在VAR变量中查找匹配PATTERN的内容,将其所有匹配到的结果删除;

${VAR/#PATTERN}:在VAR变量中查找匹配PATTERN的内容,将其行首匹配到的结果删除;

${VAR/%PATTERN}:在VAR变量中查找匹配PATTERN的内容,将其行尾匹配到的结果删除;

5.字符的大小写转换:

${VAR^^}:将VAR变量中的所有小写字母转换为大写字母;

${VAR,,}:将VAR变量中的所有大写字母转换成小写字母;

6.变量赋值:

${VAR:-value}:如果变量VAR为空或未被设置,那么直接返回value的值,否则返回变量VAR的值;

${VAR:+value}:如果变量VAR不为空,则返回value;

${VAR:=value}:如果变量VAR为空或为被设置,那么直接返回value的值,并且将value的值赋值给变量VAR;否则返回变量VAR的值;

7.变量的间接引用:

如果第一个变量的值的恰好是第二个变量的变量名,从第一个变量引用第二个变量的值的方法,就称为变量的间接引用,也称为间接变量引用;

数组

在了解数组前,我们先来聊聊变量,变量就是内存的存储空间。它的特点:是每个变量中只能存放一个数据,变量只能进行一次性的赋值。但是当我们存放本班每个人的名字与变量时,我们有一下几种方法:

1.一次性赋值:NAME="name1 name2 name3 ..."

2.使用多个变量,分别赋值:NAME1=xu、NAME2=shen;

3.数组变量

数组:存放一个或多个元素的连续的内存空间,相当于多个变量的集合;

数组元素:数组中任何一个存放数据的存储单元;

数组的索引:

1.数子:索引数组(Index ARRAY)

2.名称(字符串):关联数组(Related ARRAY) bash5.0以上的版本才支持;

数组分两种:

稠密数组:索引编号必须连续

稀疏数组:索引编号可以不连续,bash数组属于此类;

数组的声明方法:

1.declare命令:

declare -i NAME:将NAME声明为整型变量;

declare -x NAME:将NAME声明为环境变量;

declare -a NAME:将NAME声明为索引数组;

declare -A NAME:将NAME声明为关联数组;

2.直接声明数组:

直接为数组赋值:

ARRAY_NAME=("value1" "value2" "value3" ...) 声明稠密数组;

ARRAY_NAME=([0]="value1" [1]="value2" [4]="value3" ...) 声明稀疏数组

3.定义数组的元素而穿件数组:

ARRAY_NAME[0]=value1

ARRAY_NAME[1]=value2

...

引用数组中的元素:

引用变量的方法:${NAME}

引用数组元素的方法:${ARRAY_NAME[INDEX]}

注意:如果不给出INDEX,则表示引用数组的第一个元素,即INDEX=0的元素;

引用整个数组的所有元素:${ARRAY_NAME[*]}或者${ARRAY_NAME[@]}

引用数组的索引:${!ARRAY_NAME[*]}或者${!ARRAY_NAME[@]}

查看数组的长度(数组中有效元素的个数)${#ARRAY_NAME[*]}或者${#ARRAY_NAME[@]}

数组切片:

${ARRAY_NAME:offset}:显示包括offset数字所表示的索引位置及以后的所有元素;

${ARRAY_NAME:offset:number}:显示包括offset数字所表示的索引位置及以后的number个元素;

向数组中追加元素:

1.稠密数组: ARRAY_NAME[${ARRAY_NAME[*]}]=valueN

2.稀疏数组:ARRAY_NAME[INDEX]=value 注意:INDEX必须为未被使用的数组元素索引编号

撤销数组:usnet ARRAY_NAME

删除数组中的元素:unset ARRAY_NAME[INDEX]

shell脚本编程

特点:过程式编程、脚本类编程、解释型编程

过程式编程语言:

顺序执行结果:

以从左到右,从上到下顺序执行所有的语句(命令)

shell脚本的主体结构;

选择执行结构:

依照给定条件的逻辑判断结果或者依照可选的取值范围,进而选择某个分支中的语句俩执行;

if:分支选择标准,逻辑判断的结果;

case:分支选择标准,根据可选的取值;

循环执行结构:

对于某特定语句,重复执行0次,1次或多次;

for:遍历指定的列表;

while:根据逻辑判断的结果;

until:根据逻辑判断的结果;

select:死循环,利用循环机制提供选择列表;

选择执行结构:

if语句:if 命令;then 命令;[elif 命令;then 命令;]... [else 命令 ;] fi

if语句单分支结构:如果条件为真,则执行then后的命令,否则,不做任何操作;

格式:

if CONDITOINthen STATEMETfiif CONDITION ; then    STATEMENT1    STATEMENT2    ...fi

注意:想要执行then后面的STATEMENTS,前提条件是CONDITION部分为真;

if语句的双分支结构:如果条件为真,就执行then后面的命令,否则就执行else后面的命令;

if CONDITION ; then    STATEMENT    ...else    STATEMENT    ...fi

if语句的多分支结构:首先判断CONDITION1是否为真,如果为真,则执行第一个then后面的语句;否则就判断CONDITION2是否为真,如果为真,就执行第二个then后面的语句;否则就判断CONDITION3是否为真,如果为真,就执行第三个then后面的语句...如果所有的CONDITION都为假,就执行else后面的语句;

if CONDITION1 ;then    STATEMENT    ...elif CONDITION2 ; then    STATEMENT    ...elif CONDITION3 ; then    STATEMENT    ......else    STATEMENT    ...fi

建议:if多分支结构,能不用就不用

循环执行结构:

将一段代码重复的执行0次,1次或多次;

一个好的循环结构,必须要包括连个重要的环节:

进入循环的条件:

开始循环时所满足的条件;

退出循环的条件:

循环结束所满足的条件;

for循环:

1.遍历列表

for VAR_NAME in LIST ; do 循环体; donefor VAR_NAME in LIST ; do    循环体done

VAR_NAME:任意指定的变量名称,变量的值是从LIST中取值并赋值的;

循环体:一般来说是能够用到VAR_NAME的命令或命令的组合;如果循环体中没有包括VAR_NAME,则可能出现死循环;

LIST的生成方式 :

1)直接给出

2)纯整数列表

3)花括号展开

4)命令的执行结果的返回值

5)GLOBBING

6)某些变量的引用:$@, $*

2.控制变量

for ((表达式1; 表达式2; 表达式3 ));do 命令;donefor ((表达式1; 表达式2; 表达式3 ));do    循环体done

表达式1:为变量赋初始值

表达式2:循环的退出条件

表达式3:变量值的变化规律


变量 字符 数组 文件 命令 配置 循环 字符串 元素 结果 内容 语句 结构 进程 登陆 条件 用户 索引 表达式 交互式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 互联网科技公司简介 互联网金融 科技金融 互联网科技公司发展 互联网科技革命 壕鑫互联网络科技 国外互联网科技网站 华脉科技工业互联网产品 哈尔滨新华互联网科技学院 互联网科技热点资讯 银川新华互联网科技职业技术培训学校图片 科技与互联网哪个更好 赶超互联网科技 微信多开 科技类公司包括互联网吗 互联网科技和法律行业 上海同邻互联网科技有限公司规模 中国新注册互联网科技 美国五大互联网科技公司市值多少 广西泛欧互联网科技有限公司 如何强化互联网金融科技 凡科互联网科技 北京互联网络科技有限公司 碳银互联网科技有限公司 贵州叶脉互联网科技有限公司所属行业 昊天互联网科技有限公司 坤平互联网科技 民营互联网公司国防科技 互联网科技机房 上海万顺科技互联网有限公司招聘 广州三三互联网科技有限公司
0