shell编程语言学习笔记
简单介绍
- shell命令解释器:用于解释用户对操作系统的操作
- Linux启动过程:BIOS->MBR->BootLoader(grub)->kernel->systemd->系统初始化->shell
- 分离mbr
1
2dd if=/dev/sda of=mbr.bin bs=446/512 count=1
hexdump -C mbr.bin - UNIX哲学:一条命令只做一件事
基本使用
设定解释器
1 | #! /bin/bash |
注释
1 | # 要注释的内容 |
管道符
1 | |:建立2个子进程,将前一个的输出作为后一个的输入 |
执行方式
- 内建命令不需要创建子进程,只对当前shell生效
1 | bash ./xxx.sh |
重定向
- 一个进程默认会打开标准输入0、标准输出1、错误输出2
- 输入重定向 <
- 输出重定向 >
输入输出
1 | read 变量名 |
变量
命名
- 以数字、字母、下划线组成,不以数字开头
赋值
- 变量名=变量值
- let 变量名=变量值
- 命令赋值
- 命令结果赋值:$()或``
引用
- ${变量名}:对于变量的引用
- $变量名
作用范围
- 默认只生效于当前shell
- source执行文件:可使文件中的变量永久化
- export 变量名:可使变量永久化
- unset 变量名:取消并释放变量
环境变量
- 每个shell打开都可以获取的变量
- set设置变量,env查看变量,unset取消变量
- PATH=$PATH:新的环境变量
- 位置变量:$1、$2、$3、$4…………$9、${10}
- 配置文件:/etc/profile、/etc/profile.d/* 、
/bash_profile、/.bashrc、/etc/bashrc - $?:上一条命令执行是否出错
- $$:PID
- $0:当前进程的名称
数组
定义
1 | 变量名=(变量1 变量2 变量3 变量4 变量5) |
显示所有元素
1 | ${变量名[@]} |
显示元素个数
1 | ${#变量名[@]} |
调用第n个元素
1 | ${变量名[n]} |
转义
特殊符号
1 | #:注释符 |
引用符号
1 | ':单引号 |
运算符
赋值运算符
- =:赋值
- unset:取消赋值
算术运算符
- +、-、、/、*、%
- expr 运算式(只支持整数)
数字常量
- let 变量名=变量值
- 八进制以0开头
- 十六进制以0x开头
双圆括号
- ((表达式或运算式))
- echo $((表达式或运算式))
特殊符号
引号
- ‘:完全引用
- “:不完全引用
- `:执行命令
括号
- 圆括号:()、(())、$(),用于子shell、数组初始化
- 方括号:[]、[[]],用于测试表达式或数组功能
- 尖括号:<、>,用于重定向
- 花括号:{},用于输出范围和多文件赋值
运算与逻辑符号
- 算数:+、-、*、/、%
- 比较:>、<、=
- 逻辑:&&、||、!
转义符号
- \+字符
其它符号
- #:注释
- ;:命令分隔符
- ::空指令
- .:等同于source
- ~:家目录
- ,:分隔目录
- *:通配符
- ?:条件测试或通配符
- $:取值符号
- |:管道符
- &:后台运行
- _:空格
测试
- exit 可以返回上次的返回值
test
- 检查文件或者比较值
- 文件测试
- 整数比较测试
- 字符串测试
- test可简化为[]
- 拓展写法:[[]]、支持&&、||、<、>
条件语句
if-elif-else
1 | if [测试条件成立]或命令返回值为0 |
case
1 | case 变量 in |
循环语句
for循环
1 | for 参数 in 循环范围; |
C语言类型的循环语句
1 | for((变量初始化;判断条件;变量变化)) |
while循环
1 | while 条件为真或者返回值为0 |
until循环
1 | until 条件为假或者返回值为1 |
break
- 无条件退出当前循环
continue
- 退出本轮循环,直接进入下一轮循环
函数
自定义函数
定义
1 | function 函数名(){ |
调用
1 | 函数名 参数1 参数2 …… |
撤销
1 | unset 函数名 |
系统函数库
- 位于/etc/init.d/functions
- 自建函数库,使用source导入
脚本控制
优先级控制
- nice设定优先级
- renice调整优先级
捕获信号
- kill 默认发送15号给应用程序
- ctrl+c 默认发送2号给应用程序
- 9号信号不可阻塞
- 捕获信号:trap
计划任务
查询
1 | atq |
设置
1 | at 18:00 输入命令 ctrl+D |
周期性计划任务
查询
1 | crontab -l |
配置
1 | crontab -e |
计划任务加锁
延迟计划任务
- anacontab
flock 锁文件
正则表达式
元字符
- .:匹配除了换行符以外的任意单个字符
- *:匹配任意一个之前字符
- []:匹配其中任意一个字符
- ^:匹配开头
- $:匹配结尾
- \:进行转义
扩展元字符
- +:匹配前面字符至少一次
- ?:匹配前面字符0次或1次
- |:匹配前面或后面
文件查找命令find
1 | find 路径 条件 [补充条件] |
- -exec:执行命令
- -name:按照姓名查找
- -regex:按照正则查找
- -type d|f:按照文件类型查找
- -a|c|mtime:按照时间查找
文本内容的过滤grep
1 | grep 条件 文件 |
文本处理
排序
1 | sort (-r) |
剪切
1 | cut -d "分割符" -f n 文件 |
统计
1 | uniq -c 内容/文件 |
本文作者:
yd0ng
本文链接: https://blog.yd0ng.top/2020/04/04/shell%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://blog.yd0ng.top/2020/04/04/shell%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!