关于shell:shellshell-脚本快速入门

Shell 脚本编程1. 什么是 shell ?Computers understand the language of zeros and ones known as binary language. In the early days of computing, instructions were provided using binary language, which is difficult for all of us to read and write. Therefore, in an operating system there is a special program called the shell. The shell accepts human readable commands and translates them into something the kernel can read and process.shell 就是将人类可读的指令转换成计算机内核可能辨认并执行的程序。 ...

August 16, 2020 · 4 min · jiezi

关于shell:shell常见命令

cwd=$(dirname `readlink -f $0`)Get the current working directory.

August 11, 2020 · 1 min · jiezi

关于shell:好用的shell通配符

前言咱们在应用 shell 执行工作的过程中,经常会遇到须要解决一批数据的状况,如果咱们一个一个的传递参数就会十分的麻烦,这时候就须要用到 shell 的通配符性能了。例如rm *.txt能够删除当前目录下所有的 txt 文件。 性能shell 通配符起到的是拓展参数的性能,留神 shell 通配符是由 shell 解决的,而不是用到参数的命令或者语句解决的。 例如对于 rm *.txt,shell 在参数遇到通配符的时候,会把这个通配符当做门路或者文件的匹配模式去磁盘上搜寻所有的匹配项。 如果存在匹配,则把所有的匹配项替换到参数去,例如下面的命令最终的模式可能是 rm a.txt b.txt,rm命令拿到的是理论的文件列表,而不是*.txt。 如果不存在匹配或者无奈辨认该模式,则shell会将该通配符作为一个一般字符传递给命令,而后再由命令去解决。例如如果咱们目录下没有任何 txt 文件,执行下面的命令就会报错:no matches found: *.txt 跨目录匹配通配符只能匹配单层目录,如果要跨目录匹配,则要这样子写: rm */*.txt留神,下面的写法只能匹配一级子目录下的 txt 文件,没有方法匹配当前目录以及二级子目录下的文件 如果要匹配当前目录和一级子目录下的txt文件,则要用到多个通配符组合,例如如下命令 ls *{\/*,}.txt留神,以上命令在当前目录或者一级目录之一没有txt文件的时候,也会报错。 通配符shell 通配符看起来很像正则表达式,然而并不是正则表达式,它的性能比正则表达式要弱,只反对上面几种通配符模式。 *匹配 0 或多个字符 ?匹配任意一个字符 []匹配 [] 中的任意繁多字符,例如[abc]匹配a、b、c中的任何一个字符。[]反对范畴匹配,例如 [a-z]匹配所有小写字母。 {,}匹配{}中被,分隔的任意一个子字符串。例如{AA,BB,CC}.txt匹配到 AA.txt、BB.txt和CC.txt,{}也反对范畴匹配,例如{A..Z}匹配所有大写字母 {}和其余通配符不同的中央在于,即便没有匹配到数据,{}仍然会开展。例如 # 如果咱们目录下没有文件A,B,上面的命令会报错:no matches found: [AB]echo [A-B]# 上面的命令则会输入:A Becho {A-B}{}反对嵌套,因而能够组合成简单的模式。例如 echo {a{a..c},b{b..c}}#输入aa ab ac bb bc[!]和[^]匹配除了 [] 中的其余所有字符,也即不匹配[]中的所有字符。 ...

July 28, 2020 · 1 min · jiezi

Shell脚本结合Git实现增量项目部署

小Hub领读:脚本代码这么多,不是运维可能会真不会写哈哈。普通人用jenkins全量挺好的,然而代码过多时候就比拟麻烦,而且jenkins个别也要配合脚本应用更加合乎业务。 作者:CatalpaFlathttps://juejin.im/post/5cf0ed... 利用部署是开发、测试、上线必须面对的一个过程,尤其是微服务架构的呈现,运维部署从单体的部署逐步脱离出,并且越显简单。 然而,抛开多语言,多环境,集群,分布式的部署之外。就单单探讨增量部署和全量部署 1.增量和全量部署部署,除却我的项目初始化部署,最现实的状况即为:新版本更改哪些内容则更新哪些内容 1.1 增量部署1.1.1 增量部署简介增量部署个别指在每次部署过程中首先提取以后版本和行将部署版本之间的增量(包含代码、可执行文件或者配置等),并在部署过程中仅更新增量局部。 1.1.2 常见部署流程利用代码管理工具(SVN、GIT 等)提取两个版本之间的增量,并联合其余方面的增量变动。依照增量局部制订具体的部署形式,编写部署脚本,并筹备增量部署包(包含混同代码等)。散发和部署增量部署包到曾经运行上一版本的指标环境,实现零碎的版本升级。1.1.3 增量部署长处部署速度快。每次只对增量局部进行更新,缩短部署工夫缩小变动量。缩小对整个零碎的变动幅度,有些配置内容是不须要每次都更新迭代的进步安全性。因为每次支队增量进行更新,防止全副代码的泄露1.1.4 增量部署毛病增量部署 若存在其余外在部署环境依赖,则升高部署效率增量部署不像 部署环境多的状况下,对可重复性要求高增量部署对回滚操作变得不敌对1.2 如何抉择增量还是全量现有的自动化部署,大多数都 全量部署,但全量部署也有一些弊病。但能够通过一些策略进行筛选: 提前准全量部署的所有配置和资料(部署包,外在配置文件等)在进行部署,能够提高效率和速度应用灰度公布或负载平衡等办法升高全量部署对利用可用性的影响对于古代零碎中绝大部分状态无关的部署单元(利用、模块,微服务等),全量部署个别应是最优的抉择。而状态相干的部署单元(数据库等)则仍然适宜增量部署逻辑。 2.进入主题后面讲述了一些对于增量和全量部署的状况。接下来讲述如何通过 shell 脚本联合 Git Log 进行增量部署 2.1 前提环境Java 我的项目Maven 进行治理Git 作为代码仓库2.2 shell 脚本shell 老手,写得不够完满,轻喷。 2.2.1 整个 shell 脚本的模块Git 环境筹备Maven 对欲构建我的项目进行编译创立增量部署文件夹检索我的项目 target 目录通过 git diff 检索两次 commit 之间的差别,再通过检索将对应文件拷贝到 “增量文件夹” 中2.2.2 Git 环境筹备# git环境if [[ ! -d ".git" ]]; then ECHO error: please init Git Repository exit 1;fiif [[ ! -z ${branch} ]]; then git checkout ${branch}fi# 获取默认commit-hashif [[ -z "$begin_hash" ]] && [[ -z "$end_hash" ]] ; then for p in $(git log --pretty=oneline -2) ; do if [[ ${#p} -eq 40 ]]; then if [[ -z ${begin_hash} ]]; then begin_hash=${p} else end_hash=${p} break fi fi donefiis_begin_has=false# 是否以后最新commitif [[ $(git log --pretty=oneline -1) == *${begin_hash}* ]]; then is_begin_has=truefi# 非以后最新分支commit,回滚到原始版本,可能过后maven原始配置不反对compile或会呈现构建失败(如:应用本地仓/公有仓库等)if [[ ${is_begin_has} = false ]]; then project_path=$(pwd) project_name=${project_path##*/} cd .. build_project_name=${project_name}_build_temp_project if [[ ! -d ${build_project_name} ]]; then mkdir ${build_project_name} fi \cp -rf ${project_name}/. ${build_project_name} cd ${build_project_name} git reset --hard ${begin_hash}fi复制代码2.2.2.1 校验是否 git 仓库代码if [[ ! -d ".git" ]]; then ECHO error: please init Git Repository exit 1;fi复制代码2.2.2.2 查看是否须要切换分支if [[ ! -z ${branch} ]]; then git checkout ${branch}fi2.2.2.3 是否须要设置默认构建的 commit 值若执行构建时,没给增加 --begin_hash= 和 --end_hash= 进行赋值,则默认应用最新的两次 commit 来进行增量部署。 ...

July 13, 2020 · 3 min · jiezi

bash脚本通过git下拉项目对maven项目进行打包并启动

java我的项目尤其是通过maven打包的我的项目在部署上传的时候通常会遇到 打包->ssh上传->启动的麻烦。然而有时候认为我的项目小或者服务器限度没法做jenkins这类的自动化部署工具,所以就很麻烦。因而联合网上的和本人需要写了一个脚本,以实现在近程服务中只须要通过git来pull下代码后即可运行脚本执行打包部署我的项目工作,不便了很多。 首要工作当然是将我的项目pull进去 git pull其次就是执行脚本借鉴了网上的杀死过程脚本 #! /bin/bash# process-monitor.shprocess=$1ps x | grep $process | grep -v greppid = $(ps x | grep $process | grep -v grep | grep -v 'stop.sh' | awk '{print $1}')echo 敞开过程 $pidkill $pidsleep 5接下来就执行打包部署脚本#! /bin/bashmvn clean pakage -Dmaven.test.skipecho '打包胜利'\cp -rf xxxxxx/src/main/resources/application-* xxxxxx/config\cp -rf xxxxxx/target/XX.jar xxxxxx/xx.jarsh stop.sh xx.jarnohup java -Xmx128m -jar xxxxxx/xx.jar > xxxxxx/xx.log 2>&1 &echo '启动胜利'tail -f xxxxxx/xx.log还是比拟好了解的。玩个坑,看看前面可不可以做一个整合git的脚本而后再看看能不能主动或者定时工作比对git的commitId主动pull去部署

July 10, 2020 · 1 min · jiezi

1分钟系列教程Linux系统Shell脚本编写思路与过程

前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也会经常用到,因此如何写这个脚本?它的思路在哪?带这个问题引入今天的文章,仅供参考,如有不完善的地方请多指导。 问题一: 编写脚本自动统计访问网站失败的IP地址 问题二: 编写脚本自动统计十分钟内访问网站的IP地址 征对这两个问题,我的解决思路如下: 第一个问题: 1)怎么才算访问网站失败? 大家都知道,我们也会经常打不开一网站,那么访问失败,网站日志肯定会有记录的,因此,可以通过查看日志中的状态码(如200、400、403)来判断用户的访问结果 2)获取IP地址 获取IP地址就很简单了,awk命令就是个不错的选择 第二个问题: 1)统计IP地址 同第一个问题一样,方法有很多,也非常简单 2)如何取得十分钟内的日志 115.59.74.25 - - [27/Feb/2017:22:54:43 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:44 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"通过上面的日志格式,可以看出日志中是带有时间点信息的,那么只需要将时间点信息找到即可解决 3)解决时间点的问题 可以通过awk的命令来获取某段时间内的信息 awk '$4 >="[27/Feb/2017:22:54:43" && $4 <="[27/Feb/2017:22:54:53'27/Feb/2017:22:54:53"' /wwwlogs/access.log**115.59.74.25 - - [27/Feb/2017:22:54:43 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:44 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:45 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:47 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:48 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:49 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:50 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:52 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"115.59.74.25 - - [27/Feb/2017:22:54:53 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"这样就可以将一段时间内的日志信息取出 ...

July 2, 2020 · 2 min · jiezi

在线正则表达式测试

在线正则表达式测试

June 30, 2020 · 1 min · jiezi

shell三种-for循环方式

shell三种 for循环方式

June 18, 2020 · 1 min · jiezi

touch-shell脚本并修改为777权限

mksh.sh#!/bin/bashfor i in "$@"do touch ${i} chmod 777 ${i} echo "#!/bin/bash">${i}donemkcpptest.sh#!/bin/bashfor i in "$@"do touch ${i} echo '#include<iostream>#include<ctime>using namespace std;int main(int argc, char** argv){ return 0;}'>${i}done#创建cppF=time;./mkcpptest.sh ${cppF}.cpp &&vi ${cppF}.cpp;g++ -g ${cppF}.cpp -o ${cppF}.out#不创建cppF=time;vi ${cppF}.cpp;g++ -g ${cppF}.cpp -o ${cppF}.out

June 16, 2020 · 1 min · jiezi

shell语法

1.if 判断 if 后要有空格 if [ 条件判断式 ];then 程序fi或者if [ 条件判断式 ] then 程序fi2.case 语句 case 行尾必须为单词"in" case $变量值 in "值1") 如果变量值等于值1,则执行程序1 ;; "值2") 如果变量值等于值2,则执行程序2 ;; *) 如果变量值等于值2,则执行程序2 ;;esac3.for 循环 for(( 初始值;循环控制条件;变量变化 )) do 程序 done 语法2:for 变量 in 值1 值2 值3... do 程序 done 4.while 循环 while [ 条件判断式 ] do 程序 down5.读取控制台输入 read(选项)(参数)-p // 指定读取时的提示符;-t // 指定读取时等待的时间(秒)参数: 变量:指定读取时的变量名6.系统函数 // 会删除所有的前缀,包括最后一个('/')字符,然后将字符串显示出来basename /home/www/hellow.txt // hellow.txt//从包含绝对路径的文件名中,去除文件名,返回剩余的路径部分dirname /home/www/hellow.txt // /home/www6.自定义函数 ...

June 10, 2020 · 1 min · jiezi

Shell基础

cat /etc/shells // 多种解释器echo $SHELL // 默认解释器1.脚本格式脚本以#!/bin/bash 开头(指定解释器) 2.脚本执行 bash|sh hellowWorld.sh // bash或sh来执行./helloWorld.sh // 脚本需要执行权限3.多命令处理 touch bash.sh // 先创建一个脚本文件// 在脚本文件中写入如下代码#!/bin/bashcd /hometouch hi.txtecho "hahaha" >> hi.txtbash bash.sh // 执行脚本文件一、shell中的变量1.系统变量 echo $HOME // 当前用户家目录echo $PWD // 当前目录echo $SHELL // 默认解释器echo $USER // 当前用户2.自定义变量变量默认类型是字符串类型,无法直接进行数值运算变量值有空格,要用双引号或单引号括起来 A=2 // 等号两边没有空格unset A // 撤销变量readonly B=3 // 静态变量,不能unsetD="aa aavv ddd"export 变量名 // 将变量提升为全局环境变量,可供其他shell程序使用3.特殊变量$n(n为数字,$0代表该脚本名称,$1-$9代表第一到第9个参数,十以上参数需要用大括号,如${10}) sh hello.sh xx mmecho "$0 $1 $2" // 输出hello.sh xx mm$#(获取所有输入参数的个数,常用于循环) ...

June 10, 2020 · 1 min · jiezi

马哥教育学习笔记shell入门到精通第五讲

1、位置变量位置变量指的是脚本(或者函数)后跟的第n个参数。我们这里暂时先讨论脚本传参的用法。 位置变量需要使用到形如 $1、$2、$3、$4、$5、$6。其中$1表示第一个参数,$2表示第二个参数,依次往后类推即可,我们来看看使用效果。 1.1、简单的脚本参数传递先写个简单的脚本 [root@localhost ~]# cat test.sh #!/bin/bashecho "第一个参数:$1"echo "第二个参数:$2"echo "第三个参数:$3"我们写了这样的一个脚本,一共是传入三个参数,然后在脚本里面分别引用三个参数的值,现在来执行一下。 注意先赋予x权限 [root@localhost ~]# ./test.sh 11 22 33第一个参数:11第二个参数:22第三个参数:33我们使用 ./ 执行的时候,分别在脚本后面传入11、22、33这三个数值,然后在脚本内部我们已经提前定义好了引用变量,那么在执行的时候就可以把三个参数的值打印出来。 1.2、位置变量控制使用shift关键字可以实现对位置变量的控制,比如我们写个脚本 [root@localhost ~]# cat test.sh #!/bin/bashecho "第一个参数:$1"shiftecho "第二个参数:$2"echo "第三个参数:$3"现在来执行一下,这次我们传入四个参数 [root@localhost ~]# ./test.sh 11 22 33 44第一个参数:11第二个参数:33第三个参数:44喔?我们发现打印的结果中,第二个参数居然是33,然而我们传参的时候的22这个参数并没有引用到,这就是shift的作用,每执行依次shift命令,位置变量个数就会减一,而变量值则提前一位。 当然也可以设置移动n位,我们不必写上n个shift命令,而直接使用shift n即可,比如: [root@localhost ~]# cat test.sh #!/bin/bashshift 3echo "第一个参数:$1"echo "第二个参数:$2"echo "第三个参数:$3"再来执行一下 [root@localhost ~]# ./test.sh 11 22 33 44 55 66第一个参数:44第二个参数:55第三个参数:66使用shift n,那么位置变量向前移动n位,因此我们的结果是从第四个参数开始引用的,大家都学会了嘛? 1.3、注意事项当然小伙伴可能会问 $0 表示什么呢?我们来执行一下看看,还是先写个脚本 [root@localhost ~]# cat test.sh #!/bin/bashecho "第0个参数:$0"echo "第一个参数:$1"echo "第二个参数:$2"echo "第三个参数:$3"执行一下看看 ...

June 3, 2020 · 1 min · jiezi

使用shell脚本查询服务器的CPU内存磁盘分区的使用率

前言:本文将编写一个shell脚本来查询Linux服务器的CPU、内存、磁盘分区的使用率;shell脚本其实就是由基本的shell命令组合成的,所以在编写shell脚本时,需要对常用的命令要知道,如果不是很清楚的话,可以参考这篇文章:Linux学习一:常用的基础Linux命令 。脚本:#!/bin/bash#计算cpu使用率, -n number:指定在结束前应该产生的最大迭代次数或帧数,一般迭代次数越大,获取到的cpu使用率越准确; 本脚本中是迭代了5次,"-n5" cpu=`top -b -n5 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`echo $cpu'%' #统计内存使用率mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($3)/$2*100}'`# -e参数是使 "\n"换行符生效进行输出换行的echo -e $mem_used_persent'%\n' #统计分区使用情况,df -P参数可以防止打印输出的内容换行df -THP | awk -F '[ ]+' 'NR!=1{print $1","$6}'运行:编写好脚本后运行,会等到如下的输出结果: 12%37%/dev/mapper/vg_minghui-lv_root,25%tmpfs,1%/dev/sda1,10%/dev/sr0,100% 前两行的内容:12% : cpu的使用率 ; 37% : 内存的使用率; 后面四行的内容:每个磁盘分区的使用率,磁盘分区名称和其使用率之间用英文逗号隔开。 提示:在脚本编写好,且运行前,可以先使用命令 bash -n .sh 判断下脚本是否存在语法错误,如果存在语法错误的话,再使用命令 bash -x .sh 一步步执行脚本看下到底哪个地方存在语法错误。❤不要忘记留下你学习的足迹 [点赞 + 收藏 + 评论]嘿嘿ヾ一切看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ ̄=

May 28, 2020 · 1 min · jiezi