shell脚本:
明白一点:shell脚本本身是一个工具
在写shell脚本之前,就要明白:这个功能能到底如何实现?
curl 访问文件源代码,查看网站状态;
才能通过shell(bash)所提供的逻辑关系,来串联这些语句,从而实现,脚本运维自动化;
明白一点:shell脚本本身是一个工具
在写shell脚本之前,就要明白:这个功能能到底如何实现?
curl 访问文件源代码,查看网站状态;
才能通过shell(bash)所提供的逻辑关系,来串联这些语句,从而实现,脚本运维自动化;
1、bash的特性
history
重定向原理
*shell cli界面的快捷键*
ctrl+w
文件通配globbing
history
重定向原理
*shell cli界面的快捷键*
ctrl+w
文件通配globbing
2、编程原理
编程原理:二进制 程序:指令+数据+【逻辑关系】
编程语言的分类:高级语言:1、解释 2、面向 3、变量
驱动!!
编程原理:二进制 程序:指令+数据+【逻辑关系】
编程语言的分类:高级语言:1、解释 2、面向 3、变量
驱动!!
指令:
Linux系统执行的命令(基础)
Linux系统执行的命令(基础)
逻辑关系:
顺序执行
循环 for while until
分支 if case
exit break continue 函数(return)sleep
顺序执行
循环 for while until
分支 if case
exit break continue 函数(return)sleep
数据:
变量
echo print printf
输入 read
bash支持的默认变量
环境变量(可以直接在代码中使用 $RANDOM env set) cd - $OLDPWD $PWD
传参 $# $? $1 $2 ... $$ $0 $! esc+. !$ ...
自定义变量:
局部变量
函数(本地变量) local
数组
a=(a b c d e)
0 1 2 3 4 -- 5
a[5]=f
a[${#a[*]}]=f
echo ${a[*]}
echo ${#a[*]}
变量
echo print printf
输入 read
bash支持的默认变量
环境变量(可以直接在代码中使用 $RANDOM env set) cd - $OLDPWD $PWD
传参 $# $? $1 $2 ... $$ $0 $! esc+. !$ ...
自定义变量:
局部变量
函数(本地变量) local
数组
a=(a b c d e)
0 1 2 3 4 -- 5
a[5]=f
a[${#a[*]}]=f
echo ${a[*]}
echo ${#a[*]}
3、文本处理三剑客
*正则表达式(globbing)
<img src="//static.firefoxchina.cn/img/201903/7_5c862cd3c194d0.png"/>
grep "^<img[[:space:]].*/>$"
<img src="//static.firefoxchina.cn/img/201903/7_5c862cd3c194d0.png"/>
grep "^<img[[:space:]].*/>$"
*grep 行过滤
grep egrep fgrep
grep egrep fgrep
*sed 行编辑
sed的子命令 s
sed的子命令 s
*awk 报告生成
独立的编程语言解释器;他有自己独立的语法格式;
awk的工作原理:1、取 2、分隔 3、处理
awk [option]... 'program' file ...
1、option -F -v
2、program
1、print 、 printf(占位符、修饰符(注意:不能忘记回车 ))
2、变量
内置变量:NF($NF变量调用) (类似于bash的 环境变量)
FS OFS (cut --output-dimeter) RS ORS FNR NR ARGV ARGV FILENAME
-v
3、地址定界(pat 正则表达式)
1、空 2、NR>=10&&NR<=20 3、/pat/ 4、/pat1/,/pat2/ 5、BEGIN|END 6、pat1?pat2:pat3【?】
4、运算符
1、数值运算符:%【取余取模】 //【取整】
随机整数: $RANDOM%100+1 -101%100
2、比较运算 > < = != >= <=
3、逻辑运算 && || !
4、赋值运算 = += 1= ++ --
5、action
6、语法
if switch while do-while for
break continue next(!控制默认循环)
if(条件语句){执行语句}
if(条件语句){执行语句}else{执行语句}
独立的编程语言解释器;他有自己独立的语法格式;
awk的工作原理:1、取 2、分隔 3、处理
awk [option]... 'program' file ...
1、option -F -v
2、program
1、print 、 printf(占位符、修饰符(注意:不能忘记回车 ))
2、变量
内置变量:NF($NF变量调用) (类似于bash的 环境变量)
FS OFS (cut --output-dimeter) RS ORS FNR NR ARGV ARGV FILENAME
-v
3、地址定界(pat 正则表达式)
1、空 2、NR>=10&&NR<=20 3、/pat/ 4、/pat1/,/pat2/ 5、BEGIN|END 6、pat1?pat2:pat3【?】
4、运算符
1、数值运算符:%【取余取模】 //【取整】
随机整数: $RANDOM%100+1 -101%100
2、比较运算 > < = != >= <=
3、逻辑运算 && || !
4、赋值运算 = += 1= ++ --
5、action
6、语法
if switch while do-while for
break continue next(!控制默认循环)
if(条件语句){执行语句}
if(条件语句){执行语句}else{执行语句}
初始语句;while(判断条件){循环体;初始值控制语句}
for(初始语句;判断语句;初始值控制语句){循环体}
for(变量 in 列表){循环体}
for(变量 in 列表){循环体}
。。。
7、数组
列遍历的数据统计:
a
b
c
a
b
c
awk '{array[$1]++}END{for(i in array){printf "%10s出现了%10d次",i,array[i]}}' 文件名
a b c a b c
awk '/^[[:space:]]*kernel>/{{for(i=1; i<=NF; i++){array[$i]++}}END{for(j in array){print j,array[j]}}}' 文件
列遍历的数据统计:
a
b
c
a
b
c
awk '{array[$1]++}END{for(i in array){printf "%10s出现了%10d次",i,array[i]}}' 文件名
a b c a b c
awk '/^[[:space:]]*kernel>/{{for(i=1; i<=NF; i++){array[$i]++}}END{for(j in array){print j,array[j]}}}' 文件
awk '/^[[:space:]]*kernel>/{{for(i=1; i<=NF; i++){array[$i]++}}END{for(j in array){print j,array[j]}}}' 文件
awk 'program' 文件
awk 'program' 文件
1、地址定界 /^[[:space:]]*kernel>/
/pat/ pattern(正则表达式) -- ^[[:space:]]*kernel>
^ -- 以什么开头
[[:space:]] -- 空格字符
* -- 前面的字符出现任意次数
“kernel” 固定字符串
> 锚定一定是kernel
2、语法statement {{for(i=1; i<=NF; i++){array[$i]++}}END{for(j in array){print j,array[j]}}}
1、循环 -- {for(i=1; i<=NF; i++){array[$i]++}}
循环:for
赋值:array[$i]++
2、输出 -- END{for(j in array){print j,array[j]}}
END -- 在整个默认循环结束以后,执行的语句(只执行一次)
循环 -- 索引 -- j
数组值 -- 数值
/pat/ pattern(正则表达式) -- ^[[:space:]]*kernel>
^ -- 以什么开头
[[:space:]] -- 空格字符
* -- 前面的字符出现任意次数
“kernel” 固定字符串
> 锚定一定是kernel
2、语法statement {{for(i=1; i<=NF; i++){array[$i]++}}END{for(j in array){print j,array[j]}}}
1、循环 -- {for(i=1; i<=NF; i++){array[$i]++}}
循环:for
赋值:array[$i]++
2、输出 -- END{for(j in array){print j,array[j]}}
END -- 在整个默认循环结束以后,执行的语句(只执行一次)
循环 -- 索引 -- j
数组值 -- 数值