shell脚本

shell脚本
定义
提前写好可执行的命令或者语句,按顺序批量化执行任务
bash优势
1.支持tab键和快捷键
2.支持历史命令
3.支持别名命令
4.标准输入输出
5.支持重定向管道操作
抒写格式
#!/bin/bash #声明解释器
执行方式
1.chmod +x 路径 #添加执行权限然后绝对路径执行
2.bash [-x] 路径
原理:bash进程会自动生成一个bash子进程去执行脚本
source(.) 路径
原理:source是直接调用当前系统的bash 去执行脚本
重定向
1./dev/null 黑洞文件
2.> 重定向标准输出
3.>> 追加重定向标准输出
4.2> 重定向错误输出
4.&> 重定向所有输出

变量
常量定义
固定不变的值
变量定义
以固定的名称存放变化的值
调用变量
$变量名
删除变量
a=空
unset 变量名
列出变量
set 列出所有变量
env 列出所有环境变量
区分常量变量
${变量名}常量
$变量名‘常量’
变量分类
自定义变量
有我们自行定义的变量
格式:变量名=值
变量名可以是数字,字母,下划线
变量名不能以数字开头
不能出现特殊字符
等号两边不能有空格
环境变量
由系统定义的变量为系统变量
常见的环境变量
$USER #当前用户名
$PWD #当前位置
$UID #当前用户的UID
$HOME #当前用户家目录
$SHELL #当前所用解释器
$HOSTNAME #主机名
$PATH #储存命令的路径
特殊的环境变量
$PS1 #一级提示符,也就是表明当前用户身份的命令行
$PS2 # 二级提示符,也就是命令行强制转行符号
位置变量
$1, 2..... 2..... 2.....n #调用执行脚本是后面所带参数的位数
预定义变量
$0 #列出当前进程解释器或者脚本名
$$ #当前进程PID
$? #上一个命令执行状态,正常为0,不正常非0
$* #列出所有位置变量的参数
$# #列出所有位置变量参数的个数
$! #后台最后一个进程PID
KaTeX parse error: Expected 'EOF', got '#' at position 7: @ #̲所有位置参数与*相似
变量的扩展
引号的作用
单引号
界定范围,同时屏蔽特殊符号
双引号
界定范围,不屏蔽特殊符号
反撇号或者$()
将命令的输出作为值赋值给变量
read的用法
交互式
read -p 文本信息: 变量名
非交互式
stty 屏蔽回显
开启
stty -echo
关闭
stty echo
全局变量
作用
可以让bash的子进程bash使用,注意子进程bash声明的全局变量对父进程bash无效
用export命令
export 变量名=值
变量名=值 export 变量名
修改配置文件

运算(加减乘除和求模)
expr整数运算
加法
expr 1 + 1
expr $a + $b
减法
expr 2 - 1
expr $a - $b
乘法
expr 1 ‘’ 1
expr $a '
’ $b
除法
expr 3 / 3
expr $a / $b
求模(取余)
expr 4 % 2
expr $a % $b
$[ ]整数运算
加法
$[1+1]
$[a+b]
减法
$[2-1]
$[a-b]
乘法
$[12]
$[a
b]
除法
$[2/1]
$[a/b]
求模
$[3%1]
$[a%b]
let 整数运算
let a=1+1
let a++
let a–
let a+=5
let a-=5
let a*=5
let a/=5
let a%=5
bc 小数运算
echo ‘1.1+1’ | bc
echo “scale=3;10/3” | bc

条件测试
格式
test 表达式
[表达式]
分类
字符串判断
==
判断字符串相等
!=
判断字符串不想等
-z
判断字符串是否为空
! -z 或者 -n
判断字符串是否非空
数值比较
-eq 等于
-ne 不等于
-ge 大于等于
-gt 大于
-le 小于等于
-lt 小于
逻辑组合
&& 与
前面命令执行成功则执行后面的内容
|| 或
前面内容执行失败则执行后面的内容
文件类型和权限判断
-e
判断文件是否存在,不管文件类型
-f
判断文件是否存在,只能是普通文件
-d
判断文件是否处在,只能是目录
-r
判断用户是否具备read权限,注意如果时root用户这个判断时失效的
-w
判断用户是否具备write权限,注意如果时root用户这个判断时失效的
-x
判断用户是否具备执行权限
列题脚本练习

if分支
单分支
双分支
多分支
if 分支脚本练习

case分支
case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配
case分支脚本练习

字符串处理
字符串的截取
变量名 : 起始位置 : 长度 起始位置从 0 开始计数字符串的替换只替换第一个匹配结果: {变量名:起始位置:长度} 起始位置从0开始计数 字符串的替换 只替换第一个匹配结果: 变量名:起始位置:长度起始位置从0开始计数字符串的替换只替换第一个匹配结果:{变量名/old/new}
替换全部匹配结果: 变量名 / / o l d / n e w 字符串的掐头去尾从左向右,最短匹配删除: {变量名//old/new} 字符串的掐头去尾 从左向右,最短匹配删除: 变量名//old/new字符串的掐头去尾从左向右,最短匹配删除:{变量名#关键词}
从左向右,最长匹配删除:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲#*关键词} 从右向左,最…{变量名%关键词
}
从右向左,最长匹配删除:KaTeX parse error: Expected '}', got 'EOF' at end of input: …*} 初值 1)只取值,{var:-word}
若变量var已存在且非空,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响

循环
for循环 #有明确次数的循环
while循环 #循环次数不明确

函数

正则表达式
常用的工具
egrep
sed
awk
定义
用一串符号表示共同属性的数据
格式
egrep [选项] “正则表达式” 文件
前置命令 | egrep [ 选项] “正则表达式”
正则列表
基本正则
^ #以什么开头
$ #以什么结尾
^$ #表示空行
[ ] #集合,匹配集合中任意一个字符
[ ^] #集合取反
. # 匹配任意单个字符,可以是空格,但不能是空行
* #匹配前一个字符任意次数,不能单独使用
.* #正则中的通配符,表示所有字符匹配任意次数
{n,m} #匹配前一个字符n到m次
{n,} #匹配前一个字符n次起
{n} #前一个字符匹配n次
扩展正则
+ #前一个字符至少匹配一次
? #前一个字符至多匹配一次
{n,m} 同{n,m}
{n,} 同{n,}
{n} 同{n}
() 保留,结合为一个整体
| #或者
\b #单词边界,<或>
\w #匹配数字字母下划线,和\b相反
\s #匹配空格或者tab
\d #匹配数字,但只能和grep -P 使用

sed流式编辑器
作用及优势
格式
用法1:前置命令 | sed [选项] ‘条件指令’
用法2:sed [选项] ‘条件指令’ 文件… …
选项
-n #屏蔽默认输出,一般和p连用
-r #支持正则
-i #修改—必须放在所有选项的最后
条件指令
p #表示输出
d #表示删除
s/旧内容/新内容/ 注意/可以用任意三个相同的字符串表示 #替换
文本块的使用
a #行前追加
i #行后追加
c #替换行
特殊用法
匹配ip
()保留的特殊用法

awk
格式
格式1:awk [选项] ‘[条件]{指令}’ 文件
格式2:前置指令 | awk [选项] ‘[条件]{指令}’
选项
-F #指定分隔符,处理文本时,默认将空格、制表符作为分隔符
指令
print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
awk常用内置变量
$0 文本当前行的全部内容
$1 文本的第1列
$2 文件的第2列
$3 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
awk处理时机
BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
{ } 逐行处理,读取文件过程中执行,指令执行n次
END{ } 行后处理,读取文件结束后执行,指令执行1次
awk处理条件
使用正则设置条件:/正则/ ~ 包含 !~不包含
awk -F: ‘$6~/root/{print}’ user #输出第6列包含root的行
awk -F: ‘$6~/bin/{print}’ user #输出第6列包含bin的行
awk -F: ‘$6!~/bin/{print}’ user #输出第6列不包含bin的行
使用数值/字符串比较设置条件:比较符号:==(等于) !=(不等于) >(大于)

=(大于等于) <(小于) <=(小于等于)
awk -F: ‘$3<3{print}’ user #输出第3列小于3的行
awk -F: ‘$3<=3{print}’ user #输出第3列小于等于3的行
awk -F: ‘NR2{print}’ user #输出第2行
awk -F: ‘NR>2{print}’ user #输出行号大于2的行
逻辑测试条件
awk -F: ‘NR>=3&&NR<=5{print}’ user #找行号是3~5行
awk -F: 'NR
2||NR4{print}’ user #找行号是2或者4的行
awk -F: 'NR
2||NR40{print}’ user #如果只有一个条件满足就显示一个
awk -F: ‘$7~/bash/&&$3<=500’ user #找第7列包含bash并且第3列小于等于500的行
awk 'NR
2&&NR4’ user #找行号既是2又是4的行,不存在,无输出
awk -F: ‘$7~/bash/&&NR<=3’ user #找第7列包含bash并且行号是1~3的
awk -F: ‘$7~/bash/||NR<=3’ user #找第7列包含bash或者行号是1~3的
数学运算
awk 'NR%2
0{print NR,$0}’ user #在条件中使用运算,找到将行号除以2余数等于0的行,然后输出该行的行号和所有列,相当于输出偶数行
数组
数组的语法格式
定义数组的格式:数组名[下标]=元素值
调用数组的格式:数组名[下标]
数组循环
awk ‘{a[$1]++}END{for(i in a){print i,a[i]}}’ shu.txt #使用逐行任务与数组收集文档shu.txt中的信息,然后在END任务中使用for循环显示所有数组a的下标与值

脚本内容的补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值