SHELL编程笔记
首先介绍一下SHELL是面向过程的语言,过程是什么呢?
接下来我就来说说过程是什么,如果说你要做某一件事情,先要排出一个步骤,第一步干什么,第二部干什么,第三步干什么......
这时候我们就要判断,如果出现情况A,我们需要做出什么处理,如果情况B,做出什么处理,当然做出处理的时候还要做好分析,问题解决完了,分析是那个环节出了问题,保证下次不在出现同样的错误(当然也会有判断出错的时候)。
如果问题规模小,就可以步骤化,按部就班处理
以指令为中心,数据服务于指令
编程三种处理逻辑
1.顺序执行:程序按从上到下顺序执行
2.选择执行:程序执行中,根据条件的不同,进行选择不同分支继续执行
3.循环执行:程序执行执行过程中需要重复执行多次某段语句或命令
SHELLscript的用途
1.将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
2.减少手工命令的重复输入,程度上也避免了人为错误
3.将软件或应用的安装及配置实现标准化
4,用于实现日常性的,重复性的运维工作,如:文件打包压缩,监控系统运行状态并实现警告等
SHELLscript基本结构
shell是基于过程式,解释执行的语言
1.各种命令的组合
2.数据存储,变量,数组
3.表达式: a+b
4.控制语句:if
SHELL执行过程
1.添加注释
2.加执行权限,在命令上指定script的绝对或相对路径
3.调试,运行script
SHELLscript调试
只检测script中的语法错误,但无法检查命令错误,但不真正执行script : bash -n <script名>
调试执行script bash -x <script名>
总结:常见错误分为:1.语法错误 2. 命令错误 3.逻辑错误
变量:
变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
变量类型
$PS $PATH $UID $HOSTNAME $$ $BASHPID $PPID $? $HISTSIZE
用户自定义变量:不同的变量存在的数据不同,决定了以下:1,数据存储方式
2,参与的运算
3,表示的数据范围
变量数据类型:字符,数值,整型,浮点数(小数),bash不支持浮点数
静态语言和动态语言
静态编译语言,使用变量前,先声明变量类型,之后类型不能改变,在编译时检查
动态编译语言:不用事先声明,可随时改变类型
SHELL中变量命名法则
1.区分大小写,不能使用程序中的保留字和内置变量,如:if for
2.只能使用数字,字母下划线,且不能以数字开头,“注意:不支持短横线 "-",和主机名相反
通常情况下:建议大家命名变量的时候用英文单词作为命名,并体现实际作用,不要使用简写,这样看着 就见名知义
变量名大写,局部变量小写,函数名小写
普通变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前的shell的子shell进程均无效
环境变量:生效范围为当前shell进程及子shell进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
1.变量可以被追加内容
2.间接赋值和引用
环境变量 (export)
删除变量 unset name
只读变量: (readonly)
声明定义,只能读不能改
位置变量:在script代码中调用通过命令行传送给script的参数
$1,$2,.......对应第一个参数,对应第二个参数,........
$0 表示命令本身,包括路径
$* 表示所有参数为一个整体
$@ 表示所有参数为一个单词的字符串或者数值,
$# 表示传递给script参数的个数
这时候我们要注意一点:$@,$*通常情况下都是一样,只有在被双引号引起来的情况下才会有不一样的作用
set -- 清楚所有位置变量
变量扩展:` ` :反引号,命令替换,可以实现动态命令
\ :反斜线,禁止单个字符扩展
!:叹号,历史命令替换
script安全:set 命令 可以用来定制shell环境
-u 在扩展一个没有设置的变量时,显示错误信息,等同 set -o nounset
-e 如果一个命令范围一个非0,退出状态值(失败)就退出,等于set -o errexit
-o 打开或者关闭选项 :显示选项
-x当执行命令时,打印命令及其参数,类似(bash -x )
格式化输出:printf
格式:printf “指定的格式 ” “ 文本1” “文本2” ........可以加多个文本
常用格式替换符:%s 字符串
%d,%i 十进制整数
%f 浮点格式
%c ascll字符,即显示对应参数的第一个参数
%b 相对应的参数包含转义符,可以使用次替换符进行替换,对应的转义字符会被转义
%o 八进制值
%u 不带正负号的十进制数值
%x 十六进制数值(a-f)
%X 十六进制数值 (A-F)
%% 表示%本身
说明:%#s 中的数字代表此替换符中的输出字符宽度,不足补空格,默认时右对齐,%-10s表示10个字符宽度,- 表示左对齐
%03d 表示3为宽度,不足前面用0补全,超出位数鸳鸯输出
%.2f 中的2表示小数点后显示的小数位数
常用转义字符:\a 警告字符,通常为ASCLL的BEL字符 (输出ASCLL为07的时候,会发出一声“滴”的声音)
\b 后退
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ 表示本身
算术运算:(1)let var=算术表达式
(2)((var=算术表达式)) 和上面等价
(3)var=$[算术表达式]
(4)var=$(expr arg1 arg2 arg3 ........)
(5) echo '算术表达式‘ | bc
增强型赋值
++i 先加完在赋值
i++ 先赋值再加
i-- 先赋值在减
--i 先减在赋值
逻辑运算:true false
二进制数: 1 0 “ 注意:这里的0和($?)不一样,这里的0是一个十进制0”
& 与 运算 :和0的结果为0,和1相与结果保留原值,一假全假,全真才真
| 或 运算:和1相与的结果都为1,和0相或结果保留原值,一真则真,全假才false
! 非 :假的是真的 ,真的是假的
^ 异或 : 异或的两个值,相同为假,不同为真,两个数字X,Y异或得到结果Z,Z在和任意两者之一X异或,将得出另一个值Y
格式:x=1;y=2;x=$[x^y];y=$[x^y];x=$[x^y]; echo $x $y
短路运算
&& CMD1 && CMD2
如果第一个CMD1结果为真,那么CMD2也要参与运算,才能得出最终的结果
如果CMD1结果为假,那么CMD2也就不需要参与运算
短路或
|| CMD1 || CMD2
如果CMD1运行成功,那么CMD2就不需要参与运算
如果CMD1没有运算成功,那么CMD2必须要参与运算,才能得出最终的结果
条件测试命令
条件测试,判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
测试过程,实现评估布尔声明,以使用条件性环境进行执行
若真,则状态码变量 $? 返回0
若家,则状态码变量 $? 返回1
test EXPRESSION
[ EXPRESSION ] 和test等价
[[ EXPRESSION ]] 增强版的[ ] 且支持扩展正则表达式
*注意 EXPRESSION 前后都要有空格
-a 表示两个条件都确认
-b 如果file为一个特殊块file,则为true
-c file为一个字符特殊file,则为true
-d file作为一个目录,则为true
-e file存在,为true
-f file为一个普通file, 为true
-g file设置了set-group-id 为true
-G file存在且归该组所有,为true
-k 设置了file的sticky位, 为true
-O 属于自己,为true
-p file输入管道file ,为true
-r file可读,为true
-x file可执行 ,为true
-w file可写,为true
-S file位套接字file,为true
-L file为符号链接file,为true
-u file设置了set-user-id 为true
-N 如果上次的读的file未被修改过,为true
-nt 如果file1比file2更新,为true
-ot file1比file2 老 为true
-ef file1是file2的的硬链接 为true
-z 如果string为空 为true
-n 如果string 不为空,为true
-o 启用shell选项 ” 同时使用多个条件可以选用“
-v 如果设置了shell变量为true
-s file是否存在且非空
string1 = string2 相等为true (比较的时候等号两边都要有”space“)
string1 != string2 不相等true (比较的时候等号两边都要有”space“)
数值测试: [ ]
-eq 相等
-ne 不相等
-gt 大于
-ge 大于等于
-le 小于等于
-lt 小于
测试命令: [[ ]]
== 右侧为通配符
=~ 右侧为正则表达式 ( 如果匹配正则表达式,匹配到其中一个都算成功)
!= 表示不等于
-a 表示并且 (当前如果有多个条件都满足,这时候使用-a 选项,)
-o 表示或者 (当前如果有多个条件,有些条件没有满足,这时候就用-o )
小括号和花括号(){ }
()里面的指令在shell环境中运行,变量赋值和内置变量将影响shell环境 (命令和变量只在括号里面才有效)
运用的时候注意 ”开头有空格,结尾也要有空格“
{ } 切换环境 :改的只是当前环境,不开启子shell,改了外界环境,
使用花括号的时候注意 “前后有空格,结尾有分号”
组合测试条件
-a和-o需要使用测试命令进行,[[ ]] 不支持
read 命令 涵义:从标准输入中读取一行并将其分割为多个字段,(当然可以使用-p选项来定义输入的string为变量)
-p 指定要显示的内容
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d “字符”输入结束符
-t NTIMEOUT 为N秒
(read)命令可以同时创建多个变量 写法: read NAME TITLE
--------->输入的值: wang cto
第一个对应的就是$NAME的变量,第二个,也就是对应的第二个变量。
read 命令也可以使用重定向 将重定向的内容引入read 内容中
BASH SHELL 的配置文件
按生效范围划分为两类
全局配置下,针对所有用户皆有效
/etc/profile
/etc/porfile.d/*.sh
/etc/bashrc
个人配置,只针对特定用户有效
~/.bash_procfile
~/.bashrc
假如不是完全切换,只是挑了一些文件执行,会执行/etc/progile.d/*.sh, .bashrc(rc ---run command 运行)
如果是完全切换,先执行/etc/profile.d/*.sh
/etc/profile
.bashrc
.bash_profile
将来可以把一些脚本放在/etc/profile.d/ 下面,这样开机就会自启动
/etc/profile.d/*.sh .bashrc /etc/profile .bash_profile 都属于登录式配置文件
SHELL登陆两种登陆方式
交互式登录:1.直接通过终端输入账号和密码
2.使用su - username 切换的用户
非交互式登录
1.su username
2.图形界面下打开的终端
3.执行script
任何其他的bash实列
按功能划分分类
procfile类和bashrc类
procfile类为交互式登录的shell提供配置
功能:1.用于定义环境变量
2.运行script命令
bashrc类:为非交互式和交互式登录的shell提供配置
功能:1.定义命令别名
2.定义本地变量
编辑配置文件生效
修改procfile和bashrc文件后需生效两种方法:1.重启shell进程 2.source 或者 (.) 配置文件 (注意竖线为分隔符,我这里是怕大家看不清楚)
注意:suorce会在当前shell中执行script,所有一般只用于执行配置文件,或在script中调用另一个script的场景
. ~/bashrc
BASH 退出任务
保存在~/.bash_logout文件中(用户),在退出登录shell时运行
功能:1.创建自动备份 2. 清楚临时文件
.bash_logout 当用户要退出的时候也可以触发一个配置文件执行
if cmd ; then ;fi
elif cmd ; then ;
else cmd ;then
fi
for 循环
for NAME in word ; do cmd ; done
条件的个数决定了我们要循环多少次
for ((exp1;exp2;exp3)); do cmd ;done
while
while cmd;do cmds ; done
无限循环:trun ;(:)
continue 提前跳过本轮循环(跳过最内层的第一层循环)
continue 2 提前跳过(跳过最外层的第一层的一轮循环)
break 结束本轮循环(结束最内层的第一层)
break 2 结束最外层的一轮循环(结束最外层的第一层的一轮循环)
shift 表示跳过位置 比如user1创建完成之后user2顶替user1 这时候user2就变成user1
shift 2 一次性跳两个
while read 实现文本卓行处理
PS3 影响select 菜单
PS1 影响主机名颜色
PS2= 影响多行重定向 <<EOF
shift循环控制命令
shift【n】用于将参数量列表list左移指定次数,缺省为左移一次
参量列表list一旦被移动,最左端的那个参数就从列表中删除,while循环遍历位置参量列表时,常用到shift
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)