Shell 脚本编程
可以通过学习该专栏,达到可以编写简单shell脚本能力,符合初学和中级人员学习,可以从中更深层次了解shell底层机制,不止让你会写还会让你一通百通。
AllardZhao
学习的练习生,晓康。Python和Go语言追随者,喜欢学一些新技术,关注新技术发展动态。不断前进拥抱变化,永远确定的就是不确定。
展开
-
Shell编写守护进程实现nginx服务监控
需求描述: 写一个监控nginx的脚本;如果Nginx服务宕机,则该脚本可以检测到并将进程启动;如果正常运转,则不做任何处理。1. 如何判断一个进程死掉了,分析思路如下:# Mac 启动nginx服务 ~ % sudo nginx # 通过ps -ef命令查看服务是否存在,通过grep-v参数过滤掉执行查看命令时生成grep子进程~ % ps -ef | grep nginx | grep -v grep 0 36127 1 0 11:04下午 ...原创 2022-05-14 11:11:14 · 1087 阅读 · 0 评论 -
Shell结合业务编写“字符串处理”脚本及思路分析
1、结合业务介绍编写字符串处理完整脚本需求描述:变量string="Bigdata process framework is Hadoop,Hadoop is an open source project"执行脚本后,打印输出string字符串变量,并给出用户以下选项:(1)、打印string长度(2)、删除字符串中所有的Hadoop(3)...原创 2022-05-14 10:46:13 · 609 阅读 · 0 评论 -
一个复杂的awk处理生产数据的例子
(一)需求描述:利用awk处理日志,并声称结果报告生成数据脚本insert.sh,能够模拟生成一些日志数据,内容如下:#!/bin/bash#function create_random(){ min=$1 max=$(($2-$min+1)) num=$(date +%s) echo $(($num%$max+$min))}INDEX=1while truedo for user in allen mike jerry tracy han...原创 2021-12-14 11:55:03 · 1153 阅读 · 0 评论 -
文本处理三剑客之awk(7)
10、awk中数组的用法 (1) Shell中数组用法:shell中定义数组通过一对小括号将元素括起来,元素之间使用空格或者tab键分割,如下array数组。array=("Allen" "Mike" "Messi" "Jerry" "Hanmeimei" "Wang")打印元素: echo ${array[2]},shell中数组下标是从0开始,下标为2访问的是"Messi"元素,区别:Mac中shell数组下标从1开始。...原创 2021-12-14 11:54:36 · 376 阅读 · 0 评论 -
文本处理三剑客之awk(6)
8、awk中的字符串函数字符串函数对照表:函数名 | 解释 | 函数返回值length(str) 计算字符串长度 整数长度值index(str1,str2) 在str1中查找str2的位置 返回值为位置索引,从1计数tolower(str) 转换为小写 转换后的小写字符串toupper(str) 转换为大写 转...原创 2021-12-14 11:51:43 · 363 阅读 · 0 评论 -
文本处理三剑客之awk(5)
7、awk动作中的条件及循环语句(一)条件语句:if (条件表达式) 动作1else if (条件表达式) 动作2else 动作3(1)以 : 为分隔符,只打印/etc/passwd中第3个字段的数值在100-300范围内的行信息# [1].输出以冒号为分隔符,第3个字段的值大于300的所有行信息~ % awk 'BEGIN{FS=":"}{if($3>300) print $0}' /etc/passwd# 输出第3个字段的值大于100且小于300原创 2021-12-13 00:20:15 · 168 阅读 · 0 评论 -
文本处理三剑客之awk(4)
5、awk动作中的表达式用法awk动作表达式中的算术运算符:+ :加, - :减,* :乘 , / :除, % :模,求余, ^或** :乘方++X :在返回X变量之前,X变量加1X++ :在返回X变量之后,X变量加1--X :在返回X变量之前,X变量减1X-- :在返回X变量之后,X变量减1# [1].在awk中定义变量,var等于20,var1等于hello,输出这两...原创 2021-12-13 00:07:38 · 362 阅读 · 0 评论 -
文本处理三剑客之awk(3)
4、awk模式匹配的两种用法模式匹配的两种用法: 第一种模式匹配:RegExp(Regular Expression),直接跟一个正则表达式,正则表达式可以是一个常量字符串,也可以是一个正则表达式。第二种模式匹配:关系运算匹配,比如查找一个特定字符串等于某一个值的时候,然后再对它进行匹配。 用法格式对照表:RegExp :按正则表达式匹配关系运算:按关系运算匹配awk模式匹配用法总结:...原创 2021-12-13 00:07:10 · 277 阅读 · 0 评论 -
文本处理三剑客之awk(2)
3、awk格式化输出之前printfprintf的格式说明符:%s:打印字符串,s为string字符串%d:打印十进制数,d为decimal十进制%f:打印一个浮点数,f为float浮点数%x:打印十六进制数,x为hexadecimal十六进制%o:打印八进制数,o为octonary八进制%e:打印数字的科学计数法形式%c:打印单个字符的ASCII吗pr...原创 2021-12-13 00:06:28 · 1059 阅读 · 0 评论 -
文本处理三剑客之awk(1)
有一本书叫《awk编程》,一个命令称之为编程就可以看出awk本身的功能是非常强大的。awk本身称之为报告生成器,也就是awk可以对拿取到的数据进行一个处理然后生成一份很漂亮的报告,比如将Mysql中的数据,这个业务系统生成数据每天统计一下截止到昨天所有订单的数量和成交的金额,可以还需要按照业务来区分每一个不同的产品它的成交额,以便于前端部门像市场部门或者运营部门进行数据分析,从而进行不同的营销策略广告的投放,那都是awk的一个价值所在,那像这种情况下使用awk从我们的数据...原创 2021-12-13 00:04:29 · 412 阅读 · 0 评论 -
文本处理三剑客之sed(下)
4、sed中的编辑命令详解对文件的操作,无非就是增加、删除、查询、修改; (1) command(编辑命令)对照表:类别 | 编辑命令 | 含义--------------------------------------------------查询 p 打印(print)--------------------------------------------------增加 a 行后追加(append),匹配到的行后追...原创 2021-12-13 00:03:54 · 1298 阅读 · 0 评论 -
文本处理三剑客之sed(中)
3、sed中的pattern详解pattern(匹配模式)用法表:(1)10command :匹配到第10行(2)10,20command :匹配从第10行开始,到第20行结束(3)10,+5command :匹配从第10行开始,到第15行结束(4)/pattern1/command :匹配到pattern1的行(重点) *(5)/pattern1/,/pattern2/command :匹配到patt...原创 2021-12-13 00:03:18 · 301 阅读 · 0 评论 -
文本处理三剑客之sed(上)
sed 是一个流编辑器,编辑器就是对我们常见的文件进行修改或者删除行的操作,不管是删除行还是修改字符串或者修改部分内容,这都是一个编辑器应该有的功能,所以称之为流编辑器。1、sed的工作模式基础介绍:sed(Stream Editor),流编辑器。对标准输出或文件逐行进行处理,它类似于grep命令也是能够接受标准输出这些数据,把标准输出中每一行内容进入一个单独的个体,进行一些匹配之后处理然后输出。 语法格式:第一种形式(标准输...原创 2021-12-13 00:02:45 · 772 阅读 · 0 评论 -
文本处理三剑客之grep
grep 是一个过滤器,在文件中查找符合条件的内容,包含指定关键字的内容或者字符串的内容。1、grep语法格式:第一种形式:grep [option] [pattern] [file1, file2 ... ],option为可选项,pattern为匹配模式可以是一个字符串或正则表达式,文件可以跟多个或一个,这种形式为在文件中查找。第二种形式:command | grep [option] [pattern],option为可选项,grep接受前一...原创 2021-12-13 00:02:10 · 772 阅读 · 0 评论 -
Shell常用几个查找命令使用场景
find、locate、whereis和which总结及适用场景分析1. locate命令介绍文件查找命令,所属软件包mlocate不同于find命令是在整块磁盘中搜索,locate命令在数据库文件中查找find是默认全部匹配,locate则是默认部分匹配updatedb命令:用来及时更新locate命令查找的数据库文件用户更新 /var/lib/mlocate/molocate.db...原创 2021-12-13 00:01:47 · 641 阅读 · 0 评论 -
Shell文件查找之find命令(2)
(2)find常用总结1).常用选项举例:-name(重点) :查找/etc目录下以conf结尾的文件。find /etc/ -name '*.conf',搜索的到的文件都是以'*.conf'结尾,直接在etc目录下的文件会被搜索出来,同样的在etc目录下的子目录中的文件也会被搜索出来。如果没有指定搜索层级find命令默认递归搜索,在etc目录下会逐级搜索直到搜索完所有路径下的所有文件。-name有个缺点就是需要匹配大小写[1] -iname(重点) :查...原创 2021-12-12 22:34:13 · 3238 阅读 · 0 评论 -
Shell文件查找之find命令(1)
日常工作中常用到脚本,像数据备份、数据压缩等等这样一些脚本。find命令的优点:条件比较多应用场景广范,缺点:效率比较低,速度比较慢。1、文件查找之find命令 (1) 语法格式: find [路径] [选项] [操作]1). 路径:可以写相对路径,也可以写绝对路径。2). 选项参数对照表:[1] -name :根据文件名查找[2] -perm :根据文件权限查找,如权限777,通...原创 2021-12-12 22:23:44 · 4378 阅读 · 0 评论 -
Shell函数库
(1)为什么要定义函数库:经常使用的重复代码封装成函数文件,以便于在其它需要调用这段重复代码的时候直接引用函数文件,也不必再去重新书写一段重复的代码,这就是和最初使用函数的初衷是一致的。一般不直接执行,而是由其它脚本调用,在一个脚本中需要引用基础性函数时候,可以把函数库文件给引用进来,在Linux中可以通过(.)点或source命令引入进来。(2)经验之谈库文件名的后缀是任意的,但一般使用.lib,一种约定俗成规范库文件...原创 2021-12-12 22:14:00 · 316 阅读 · 0 评论 -
Shell中局部变量和全局变量
在shell编程过程中,不同于其他编程语言,在一些高级编程语JAVA或Python过程中,在定义一个变量的时候,如果这个变量是在函数中声明的变量,那么在函数外面是不能直接使用这个变量的,也就是说在高级语言中变量是有作用域的。1、全局变量:不做特殊声明,Shell中变量都是全局变量Tips:大型脚本程序中函数慎用全局变量2、局部变量:定义变量时,使用local关键字函数内和外若存在同名变量,则函数内部变量覆...原创 2021-12-12 22:13:34 · 5728 阅读 · 2 评论 -
Shell函数返回值
1、返回值的方式:方法一:return方法二: echo2、return和echo使用场景区别:(1).使用return返回值:使用return返回值,只能返回1-255的整数函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败(2).使用echo返回值:使用ec...原创 2021-12-12 22:13:12 · 24593 阅读 · 0 评论 -
Shell向函数传递参数
1、其它高级语言传参,如Java:int example_1(int arg1, int arg2){ arg1=arg2 .... .... .... .... return null}高级语言函数调用: int num1=10; int num2=20; 调用函数形式一:int num3=example_1(num1,num2); 调用函数形式二: int num4 num4=exam原创 2021-12-12 22:12:40 · 1621 阅读 · 0 评论 -
Shell函数的定义和使用
1、函数的定义和使用说要写一个函数,这通常意味着在程序中有些经常使用的功能,需要把这些经常使用的功能给封装起来,封装到一个函数当中,这样在写程序的过程中可以在任何地方直接去调用这个函数,而不必再去实现函数这些基础功能再写一遍代码,更好的去复用代码,也能够使程序的维护者能够有一个更好的可读性,给后续维护也能够提供更多的方便。(1).函数介绍:Linux Shell中的函数和大多数编程语言中的函数一样...原创 2021-12-12 22:12:12 · 429 阅读 · 0 评论 -
Bash数学运算值bc
1、bc介绍:bc是bash内建的运算器,支持浮点数运算。内建变量scale可以设置,默认为0,scale指定精确程度。bc如果没有特别指定的时候,它默认也是精确到整数。注: scale=2 # 设置默认精确到小数点后两位,不设置默认精确为0位2、bc操作符对照表:num1 + num2:求和num1 - num2:求差num1 * num2:求积...原创 2021-12-12 19:32:24 · 975 阅读 · 0 评论 -
Bash数学运算值expr
1、语法格式方法一:expr $num1 operator $num2方法二:$(( $num1 operator $num2 ))2、expr操作符对照表num1 | num2 :num1不为空且非0,返回num1;否则返回num2num1 & num2 :num1不为空且非0,返回num1;否则返回0num1 < num2 :num1小于num2,返回1;否则返回0...原创 2021-12-12 19:31:54 · 1550 阅读 · 0 评论 -
Shell变量的高级用法之有类型变量
1、有类型变量强类型编程语言中在定义一个变量的时候必须为这个变量定义类型,比如定义一个变量为整型那么可以定义为int类型、定一个变量为字符串类型那么可以定义为String类型、定义一个变量为日期类型可以定义为date类型,也就是说在正式使用这个变量之前必须首先为该变量定义类型,这是强类型语言的编程风格。在shell编程过程中由于shell本身是一个弱类型的语言,并不需要为这个变量在引用之前特意去声明类型,但是shell本身也是支持提前声明有类型变量的,只是说和强类型编...原创 2021-12-11 17:12:16 · 913 阅读 · 0 评论 -
Shell变量的高级用法之命令替换
1、命令替换所谓命令替换就是将某一段shell命令的执行结果,作为另一个shell命令中的一部分,这就是命令替换。比如在shell中经常需要获取系统时间,把系统时间赋值给某一个变量,那某一个变量在一段话中可以显示或者在一段输出中给予显示,那么这样就涉及到命令替换。其实有更简便的方式不需要将data变量值赋值给一个变量,而是打印的时候直接引用data变量的值作为输出的一部分。2、语法格式:方法一:`command`...原创 2021-12-11 17:03:27 · 2627 阅读 · 0 评论 -
Shell变量的高级用法之字符串处理(二)
2、字符串处理对于字符串的处理无外乎有这几种形式,如获取字符串长度、获取字符串中某一个字串的索引位置或者获取某一个字串在字符串中长度。需要注意的是如果使用的是Mac系统原生shell,它是不兼容expr length/index/match/substr这种形式,可以自己本地部署Linux虚拟系统或使用网上Bash在线工具练习。(1)计算字符串长度方法一:${#string},说明:获取string变量长度。方法二:expr ...原创 2021-12-11 01:34:58 · 1091 阅读 · 0 评论 -
Shell变量的高级用法之字符串处理(一)
1、变量替换和测试变量在任何编程语言中都是最基础一个概念,对变量的操作无非就是给变量进行赋值、对变量进行增删改查操作。变量替换最初它的应用场景,就是需要对一个变量根据某一种形式来进行一些操作,比如:修改变量的内容值,初始化得到一份变量之后,在某些场景下需要对这个变量进行一些修改,如删除其中某些数值得到一个新的变量,删除时候可能有时候可以基于这种字符串形式来删除,有时候还可以像基于正则表达式匹配模式的这种形式删除,对于这两种场景实际运用中还是比较多。(1)变量替换和...原创 2021-12-11 01:34:26 · 953 阅读 · 0 评论 -
Shell中处理循环的输出
当执行循环体时,每次循环都会有一次输出,可以先把所有的输出先存放到一个指定的文件中,如果需要使用可以再读取这个文件,如果不想要输出内容可以直接指定到垃圾桶中。#!/bin/bashfor (( i=1; i<100; i++))do echo "Number is $i"# 输出重定向到result.txtdone > /tmp/result.txtfor (( i=1; i<100; i++))do echo "Number is $i"# 通...原创 2021-12-11 01:34:11 · 1299 阅读 · 0 评论 -
Shell中控制循环的continue指令
1、continue指令并不会直接终止整个循环,而只是终止当前变量中的一个指令。#!/bin/bashfor (( i=10; i<20; i++))do if (( i>0 && i<15));then continue else echo "Number is $i" fidone# 执行结果% sh 19.continue_circulation.shNumber is 15Number is 16Number is 17Nu原创 2021-12-11 01:33:57 · 9842 阅读 · 0 评论 -
Shell中控制循环的break指令
1、break指令会跳出循环,不再继续执行#!/bin/bashfor ((i=1; i<=10; i++ ))do # 当i=5时,终止循环,跳出循环体 if (( i == 5));then break fi echo "Number is $i"done# 运行结果% sh 18.break_circulation.sh Number is 1Number is 2Number is 3Number is 42、break指令指定跳出循环层级.原创 2021-12-11 01:33:41 · 7261 阅读 · 0 评论 -
Shell入门之while和until循环
1、while循环命令语法:while commanddo commandsdone使用注意事项:当不满足条件时,终止循环执行;当满足条件时,才能执行循环体。2、while循环 代码示例#!/bin/bashnum=10while [ $num -lt 20 ]do echo "Number is $num" num=`expr $num + 5`done# 使用C语言风格while循环a=5while (( a<20 &...原创 2021-12-11 01:35:17 · 230 阅读 · 0 评论 -
Shell入门之for循环
1、简介:循环遍历一系列特定值,然后在结构体中针对每个特定值做处理语法:for var in listdo commandsdone注:list可以是常量字符串(如枚举值),也可以是命令执行结果(如遍历目录下所有文件)2、代码示例:(1)for循环读取列表的值#!/bin/bash# 遍历常量列表,其中有很多枚举类型城市名称for i in Beijing shanghai shenzhendo echo "...原创 2021-12-10 00:20:02 · 478 阅读 · 0 评论 -
Shell条件测试之文件比较
文件比较(文件测试运算符):-d file : file是否为目录,directory简写d-f file : file是否为文件,file简写为f-e file :file是否存在,exist简写为e-r file :file是否可读,read简写r-w file : file是否可写,write简写为w-x file : file是否可执行,execute执行简写为x...原创 2021-12-10 00:19:14 · 464 阅读 · 0 评论 -
Shell条件测试之字符串比较
1、字符串比较(字符串运算符):str1 = str2 : 相等比较str1 != str2 : 不等比较str1 < str2 : str1小于str2为true,比较字母在字母表顺序,字母越靠后就越大,反之越小str1 > str2 : str1大于str2为true,比较字母在字母表顺序,字母越靠后就越大,反之越小-n str1 : str1长度不是0则为true-z s...原创 2021-12-10 00:18:54 · 19189 阅读 · 0 评论 -
Shell条件测试之数值比较
数值比较(关系运算符):n1 -eq n2 : n1和n2相等,则返回true;否则返回falsen1 -ne n2 : n1和n2不相等,则返回true;否则返回falsen1 -gt n2 : n1大于n2,则返回true;否则返回falsen1 -ge n2 : n1大于等于n2,则返回true;否则返回falsen1 -lt n2 : n1小于n2,则返回true;否则返回false...原创 2021-12-10 00:18:28 · 565 阅读 · 0 评论 -
Shell入门之case语句
根据不同条件进行不同操作:if语句写法:if((a==1));then commandselif((a==2));then commandselse commandsfi 【--等价--】 case语法:case $var inpattern 1) commands ;;pattern 2) commands ;;esac注:pattern:可以是常量值,...原创 2021-12-10 00:18:07 · 114 阅读 · 0 评论 -
Shell入门之if-then中使用“双方括号”
单方括号条件测试语法: {等价逻辑} 双方括号条件测试语法:if [ $n1 -gt $n2 ] && [ $n2 -lt $n3 ] if [[ $n1 -gt $n2 && $n2 -lt $n3 ]]then then commands commandsfi fi注意事项:双方括号结构中,变量名引用必须加$[[ 后面必须有空格,...原创 2021-12-10 00:17:38 · 681 阅读 · 0 评论 -
Shell入门之if-then中使用“双括号”
1、使用双括号进行算数运算使用双括号可以进行算数运算,可以写类C语言的运算表达式a++ 或者 b-- 或者 a+=1 或者 a<b 或者 a != b2、Condition使用双括号语法:if ((expression))then commandsfi3、可用运算符value++ : 后增 value-- : 后减++value : 先增 --value : ...原创 2021-12-10 00:17:18 · 1484 阅读 · 0 评论 -
Shell入门之复合条件
(逻辑运算符)语法:(1)条件: 与 (2)条件: 或if condition1 && condition2 if condition1 || condition2then then commands commandsfi fi代码示例:#!/bin/bashvar1=16var2=26var3=36if [ $var2 -gt $var1 ] && [原创 2021-12-10 00:16:54 · 2135 阅读 · 0 评论