教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物

shell语言(十分钟带你学会Shell脚本!)

  shell语言(十分钟带你学会 Shell 脚本!)
  本篇文章没有太多的理论知识,主要分为基础语法案例、常用工具型命令(重点:帮助我们完成复杂需求)、工作中常见的需求(实战案例有源码,工作中可以直接套用),建议花十分钟阅读一遍收藏即可,当工作中需要编写 Shell 脚本直接套用案例中的脚本模板,足可满足后端开发的大部分需求。
  作为一名后端程序员,如果不掌握基础的 Shell 脚本,那么运维编写的一些简单的脚本根本无法看懂,也不便于与运维进行沟通交流。掌握 Shell,可以帮助我们提高日常工作效率,比如快速构建部署项目、管理集群、监控服务器、定时清理日志文件或管理服务器等等。概述
  Shell 是由 C 语言编写而成,外号俗称壳。开发者如果想操作 Linux 系统内核,必须通过 Shell 脚本进行交互,解释和执行用户命令,不可以绕过 Shell 直接操作 Linux 内核。Shell 是一门强大的编程语言,容易上手功能强大。
  Shell 解析器
  Linux 中有几种常见的解析器,后面的模板都是使用 Bash(最常用的解析器)解析器进行编写,查看当前系统支持哪些解析器:cat/etc/shells
  查看当前系统使用的 Shell 解析器:echo$SHELL
  基础语法与实操案例Shell 变量
  对于后台开发者,系统环境变量一定不会陌生,这里不做过多赘述。Shell 变量分为两种:系统变量、自定义变量。系统变量
  常见的系统变量如下:
  变量名
  解释
  $PWD
  脚本执行的当前所在目录
  $UID
  当前操作的系统用户 ID
  \$\$
  当前操作用户的 PID
  $#
  当前脚本的参数个数
  $*
  当前脚本的所有参数
  $0
  当前执行程序的名称
  $n
  当前程序的第 N 个参数
  $HOME
  当前程序的 home 目录
  $USER
  查询当前程序使用的操作用户自定义变量
  1. 变量命令规则
  变量名必须是以字母或下划线字符"_"开头,后面字母、数字或下划线字符。切记不用使用特殊符号,给自己带来不必要的麻烦。
  2. 查看当前 Shell 所有的环境变量
  3. 编写自定义变量#变量名=值如:A=1等号两边不要有空格,如果值中间存在空格,请使用单引或者双引号:A='张三'#撤销变量unsetA#定义静态变量,静态变量不可以二次赋值,静态变量不可以unset撤销readonlyB=2
  4. 变量的作用域
  普通的变量作用域为当前的执行程序,程序外部不可使用当前定义的变量。通过 export 可以把变量升级为全局环境变量,这样当前系统所有程序都可以使用这个环境变量。
  创建测试脚本:touchtest.sh
  赋值执行权限:chmodu+xtest.sh
  编写脚本:vimtest.sh
  定义全局脚本(脚本内容如下):exportuser_name="张三"#!/bin/bashecho$user_name
  5.由于定义了全局变量,所以执行脚本可以正常输出 \$user_name 变量的值,反之脚本中定义的局部变量,其它脚本中不可以正常输出结果。./test.sh运算符
  运算符的种类大致可以分为(直接上代码示例)4 种。算数运算符#!/bin/basha=10b=20#加法val=`expr$a+$b`echo"a+b:$val"#减法val=`expr$a-$b`echo"a-b:$val"#乘法val=`expr$a\*$b`echo"a*b:$val"#除法val=`expr$b/$a`echo"b/a:$val"#取余val=`expr$b%$a`echo"b%a:$val"#等于if[$a==$b]thenecho"a等于b"fiif[$a!=$b]thenecho"a不等于b"fi关系运算符#!/bin/basha=10b=20#等于if[$a-eq$b]thenecho"$a-eq$b:a等于b"elseecho"$a-eq$b:a不等于b"fi#不等于if[$a-ne$b]thenecho"$a-ne$b:a不等于b"elseecho"$a-ne$b:a等于b"fi#大于if[$a-gt$b]thenecho"$a-gt$b:a大于b"elseecho"$a-gt$b:a不大于b"fi#小于if[$a-lt$b]thenecho"$a-lt$b:a小于b"elseecho"$a-lt$b:a不小于b"fi#大于等于if[$a-ge$b]thenecho"$a-ge$b:a大于或等于b"elseecho"$a-ge$b:a小于b"fi#小于等于if[$a-le$b]thenecho"$a-le$b:a小于或等于b"elseecho"$a-le$b:a大于b"fi布尔运算符#!/bin/basha=10b=20#!非运算,跟java一样if[$a!=$b]thenecho"$a!=$b:a不等于b"elseecho"$a==$b:a等于b"fi#与运算,跟java里面的&&一样if[$a-lt100-a$b-gt15]thenecho"$a小于100且$b大于15:返回true"elseecho"$a小于100且$b大于15:返回false"fi#或运算,与java里面的||同理if[$a-lt100-o$b-gt100]thenecho"$a小于100或$b大于100:返回true"elseecho"$a小于100或$b大于100:返回false"fiif[$a-lt5-o$b-gt100]thenecho"$a小于5或$b大于100:返回true"elseecho"$a小于5或$b大于100:返回false"fi字符串运算符#!/bin/basha="abc"b="efg"#判断字符串是否相等if[$a=$b]thenecho"$a=$b:a等于b"elseecho"$a=$b:a不等于b"fi#判断字符串不相等if[$a!=$b]thenecho"$a!=$b:a不等于b"elseecho"$a!=$b:a等于b"fi#-n判断字符串长度是否不为0if[-n"$a"]thenecho"-n$a:字符串长度不为0"elseecho"-n$a:字符串长度为0"fi#与-n相反if[-z$a]thenecho"-z$a:字符串长度为0"elseecho"-z$a:字符串长度不为0"fi#$表示检查字符串是否为空if[$a]thenecho"$a:字符串不为空"elseecho"$a:字符串为空"fi流程控制
  if else 不再做介绍,上述运算符案例中有大量使用,对于后端开发及其简单,流程控制在程序用使用非常频繁。case 语法直接套用
  最后的 *) 表示默认模式,相当于 Java 中的 default,;; 表示命令序列结束,相当于 Java 中的 break。!/bin/bashcase$1in"1")echo"张三";;"2")echo"李四";;*)echo"王二";;esacfor 循环
  案例:从 1 加到 100。#!/bin/bashs=0for((i=0;i<=100;i++))dos=$[$s+$i]doneecho$swhile 循环
  案例:从 1 加到 100。#!/bin/bashs=0i=1while[$i-le100]dos=$[$s+$i]i=$[$i+1]done#输出值echo$s函数
  Shell 脚本和其它编程语言类似,分为系统函数和自定义函数。系统函数
  1. basename 基本语法basename路径后缀
  功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
  不加后缀:
  加后缀:
  如果脚本中需要获取当前路径的后缀名称:
  2. dirname 基本语法dirname文件绝对路径
  功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。
  自定义函数
  1. 基本语法:[function]funname[()]{Action;[returnint;]}
  2. 经验技巧
  必须在调用函数地方之前,先声明函数,Shell 脚本是逐行运行。不会像其它语言一样先编译。
  函数返回值,只能通过 $? 系统变量获得,可以显示加 return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0~255)。
  3. 案例实操
  函数无返回值:计算两个输入参数的和。
  脚本源码:#!/bin/bashfunctionsum(){s=0s=$[$1+$2]echo"$s"}#read读取控制台的输入,n1,n2用于接收输入内容,-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒)read-p"Pleaseinputthenumber1:"n1;read-p"Pleaseinputthenumber2:"n2;#调用方法sum$n1$n2;
  函数有返回值:计算两个输入参数的和(函数返回值,只能通过$?系统变量获得)。
  #!/bin/bashfunctionsum(){#read读取控制台的输入,n1,n2用于接收输入内容,-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒)read-p"Pleaseinputthenumber1:"n1;read-p"Pleaseinputthenumber2:"n2;return$(($n1+$n2))}#调用方法sumecho"计算两个数字之和为$?!"常用的 Shell 工具
  下面列举的几个命令非常实用,命令的具体使用方法请阅读:Linux 命令大全,非常重要且命令参数太多,这里不做过多赘述。
  awk:非常强大的文本分析功能,开发中使用非常频繁。
  sort:对文件进行排序,并将标准结果显示输出。
  sed:sed 是一种流编辑器,一次处理一行内容。
  cut:主要用于剪切字符、字节,并输出结果。开箱即用的 Shell 脚本
  请用 Shell 脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符"shen"的文件名称。grep-r"shen"/home|cut-d":"-f1
  判断用户输入的是否为 IP 地址:#!/bin/bashfunctioncheck_ip(){IP=$1VALID_CHECK=$(echo$IP|awk-F.'$1<=255&&$2<=255&&$3<=255&&$4<=255{print"yes"}')ifecho$IP|grep-E"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null;thenif[$VALID_CHECK=="yes"];thenecho"$IPavailable."elseecho"$IPnotavailable!"fielseecho"Formaterror!"fi}check_ip192.168.1.1check_ip256.1.1.1
  定时清空文件内容,定时记录文件大小:#!/bin/bash#每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内#容清空,但不删除文件,#其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件logfile=/tmp/`date+%H-%F`.logn=`date+%H`if[$n-eq00]||[$n-eq12]then#通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作foriin`find/data/log/-typef`dotrue>$idoneelseforiin`find/data/log/-typef`dodu-sh$i>>$logfiledonefi
  检测网卡流量,并按规定格式记录在日志中:#!/bin/bash########################################################检测网卡流量,并按规定格式记录在日志中#规定一分钟记录一次#日志格式如下所示:#2019-08-1220:40#ens33input:1234bps#ens33output:1235bps######################################################3while:do#设置语言为英文,保障输出结果是英文,否则会出现buglogfile=/tmp/`date+%d`.log#将下面执行的命令结果输出重定向到logfile日志中exec>>$logfiledate+"%F%H:%M"#sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8sar-nDEV159|grepAverage|grepens33|awk'{print$2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'echo"####################"#因为执行sar命令需要59秒,因此不需要sleepdone
  计算文档每行出现的数字个数,并计算整个文档的数字总数:#!/bin/bash##########################################################计算文档每行出现的数字个数,并计算整个文档的数字总数#########################################################使用awk只输出文档行数(截取第一段)n=`wc-la.txt|awk'{print$1}'`sum=0#文档中每一行可能存在空格,因此不能直接用文档内容进行遍历foriin`seq1$n`do#输出的行用变量表示时,需要用双引号line=`sed-n"$i"pa.txt`#wc-L选项,统计最长行的长度n_n=`echo$line|seds'/[^0-9]//'g|wc-L`echo$n_nsum=$[$sum+$n_n]doneecho"sum:$sum"
  杀死所有脚本:#!/bin/bash#################################################################有一些脚本加入到了cron之中,存在脚本尚未运行完毕又有新任务需要执行的情况,#导致系统负载升高,因此可通过编写脚本,筛选出影响负载的进程一次性全部杀死。################################################################psaux|grep指定进程名|grep-vgrep|awk'{print$2}'|xargskill-9
  从 FTP 服务器下载文件:#!/bin/bashif[$#-ne1];thenecho"Usage:$0filename"fidir=$(dirname$1)file=$(basename$1)ftp-n-v<<EOF#-n自动登录open192.168.1.10#ftp服务器useradminpasswordbinary#设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误cd$dirget"$file"EOF
  监测 Nginx 访问日志 404 情况:#场景:#1.访问日志文件的路径:/data/log/access.log#2.脚本死循环,每10秒检测一次,10秒的日志条数为300条,出现404的比例不低于10%(30条)则需要重启php-fpm服务#3.重启命令为:/etc/init.d/php-fpmrestart#!/bin/bash############################################################监测Nginx访问日志404情况,并做相应动作###########################################################log=/data/log/access.logN=30#设定阈值while:do#查看访问日志的最新300条,并统计404的次数err=`tail-n300$log|grep-c'404"'`if[$err-ge$N]then/etc/init.d/php-fpmrestart2>/dev/null#设定60s延迟防止脚本bug导致无限重启php-fpm服务sleep60fisleep10done
  iptables 自动屏蔽访问网站频繁的 IP
  方法 1:根据访问日志(Nginx 为例)。#!/bin/bashDATE=$(date+%d/%b/%Y:%H:%M)ABNORMAL_IP=$(tail-n5000access.log|grep$DATE|awk'{a[$1]++}END{for(iina)if(a[i]>100)printi}')#先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。forIPin$ABNORMAL_IP;doif[$(iptables-vnL|grep-c"$IP")-eq0];theniptables-IINPUT-s$IP-jDROPfidone
  方法 2:通过 TCP 建立的连接。#!/bin/bashABNORMAL_IP=$(netstat-an|awk'$4~/:80$/&&$6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(iina)if(a[i]>100)printi}')#gsub是将第五列(客户端IP)的冒号和端口去掉forIPin$ABNORMAL_IP;doif[$(iptables-vnL|grep-c"$IP")-eq0];theniptables-IINPUT-s$IP-jDROPfidone
  Expect 实现 SSH 免交互执行命令:登录脚本:#catlogin.exp#!/usr/bin/expectsetip[lindex$argv0]setuser[lindex$argv1]setpasswd[lindex$argv2]setcmd[lindex$argv3]if{$argc!=4}{puts"Usage:expectlogin.expipuserpasswd"exit1}settimeout30spawnssh$user@$ipexpect{"(yes/no)"{send"yes\r";exp_continue}"password:"{send"$passwd\r"}}expect"$user@*"{send"$cmd\r"}expect"$user@*"{send"exit\r"}expecteof
  执行命令脚本:写个循环可以批量操作多台服务器。#!/bin/bashHOST_INFO=user_info.txtforipin$(awk'{print$1}'$HOST_INFO)douser=$(awk-vI="$ip"'I==$1{print$2}'$HOST_INFO)pass=$(awk-vI="$ip"'I==$1{print$3}'$HOST_INFO)expectlogin.exp$ip$user$pass$1done
  Linux 主机 SSH 连接信息:#catuser_info.txt192.168.1.120root123456
  创建 10 个用户,并分别设置密码,密码要求 10 位且包含大小写字母以及数字,最后需要把每个用户的密码存在指定文件中:#!/bin/bash###############################################################创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字#最后需要把每个用户的密码存在指定文件中#前提条件:安装mkpasswd命令###############################################################生成10个用户的序列(00-09)foruin`seq-w009`do#创建用户useradduser_$u#生成密码p=`mkpasswd-s0-l10`#从标准输入中读取密码进行修改(不安全)echo$p|passwd--stdinuser_$u#常规修改密码echo-e"$p\n$p"|passwduser_$u#将创建的用户及对应的密码记录到日志文件中echo"user_$u$p">>/tmp/userpassworddone
  扫描主机端口状态:#!/bin/bashHOST=$1PORT="2225808080"forPORTin$PORT;doifecho&>/dev/null>/dev/tcp/$HOST/$PORT;thenecho"$PORTopen"elseecho"$PORTclose"fidone用Shell打印示例语句中字母数小于6的单词#示例语句:#Bashalsointerpretsanumberofmulti-characteroptions.#!/bin/bash###############################################################Shell打印示例语句中字母数小于6的单词##############################################################forsinBashalsointerpretsanumberofmulti-characteroptions.don=`echo$s|wc-c`if[$n-lt6]thenecho$sfidone

杰森斯坦森新片(杰森斯坦森最新动作片来了!)杰森斯坦森新片(杰森斯坦森最新动作片来了!)3月30日,由盖里奇执导杰森斯坦森主演的犯罪动作片人之怒首次发布预告。该片讲述了神秘冷酷的男子H,作为新来的运钞车保安,在一场抢劫中大秀报纸广告语(报纸广告还能这样打)报纸广告语(报纸广告还能这样打)虽说现在买报纸的人不多了,但报纸广告的创意却好像花样越来越多为宣传权游,HBO在纽约时报投上了巨龙的阴影三星为了在瑞士推广GalaxyS8,把瑞士规小眼睛变大眼睛化妆(小眼睛该怎么化妆让眼睛变大呢?)小眼睛变大眼睛化妆(小眼睛该怎么化妆让眼睛变大呢?)当今社会大家都很喜欢大眼睛的美美,因为能使整个人看起来更精神,更有活力。所以眼睛的大小不是由自己决定的,如果说是小眼睛该怎么化妆空间闪字制作(PS制作漂亮的蓝色星光闪动字)空间闪字制作(PS制作漂亮的蓝色星光闪动字)如果对时间轴及GIF动画比较了解,那么制作闪动文字动画就非常简单。只需要制作3个或多个文字图层,每层文字有一些差异,然后在时间轴中连续播名牌运动鞋(名牌运动鞋竟被洗掉LOGO)名牌运动鞋(名牌运动鞋竟被洗掉LOGO)图说鞋子被描上以假乱真的VALENTINO来源采访对象供图(下同)一双标价6700元的华伦天奴运动鞋,丈夫只穿了几次,就送去爱革魔都鞋匠店精网页字体大小设置(网页字体大小怎么调?)网页字体大小设置(网页字体大小怎么调?)大家好,我是大明,网页的字体太大或太小都影响我们正常的浏览,导致网页字体大小不合适的主要原因是显示适配器分辨率,显卡驱动问题,网页字体设置不手机淘宝字体怎么变大(手机淘宝页面变大了怎么办)淘宝为了方便年长的用户们使用,在近期更新中为各位消费者们带来了长辈模式,开启后页面变得更加简洁,字体也变大了不少。这里就是小编为各位准备的设置步骤,一起来操作一下吧!淘宝长辈版怎么腰椎间盘突出能治好吗(腰椎间盘突出症的诊断治疗和预防保健)腰椎间盘突出能治好吗(腰椎间盘突出症的诊断治疗和预防保健)目前最先进的腰椎内镜手术治疗腰椎间盘突出椎间盘位于相邻两椎体之间,由内外两个部分组成。内部为髓核,富有弹性,有缓和冲击的作举杯邀明月全诗(内心寂寥,只好举杯邀明月共饮)举杯邀明月全诗(内心寂寥,只好举杯邀明月共饮)月下独酌李白花间一壶酒,独酌无相亲。举杯邀明月,对影成三人。月既不解饮,影徒随我身。暂伴月将影,行乐须及春。我歌月徘徊,我舞影零乱。醒煤化工是以煤为原料(用政策倒逼现代煤化工减碳)煤化工是以煤为原料(用政策倒逼现代煤化工减碳)现代煤化工,是以煤炭为主要原料以生产清洁能源和化工产品为主要目标的现代化煤炭加工转化产业。近年来,我国现代煤化工行业稳步发展,煤制油煤初中英语说课稿(初中英语说课示范稿)初中英语说课稿(初中英语说课示范稿)初中英语Whatsthebestmovietheater?说课稿Goodmorningafternoon,everyone!Imveryglad
北冰洋为什么那么贵(北冰洋汽水卖那么贵有销量吗)在老汽水朋友圈里,北京的北冰洋独树一帜,它是地地道道的北京文化符号之一,历史人文背景深厚丰富,故事最多,在它身上,既能看到生动的老北京市民史,同时也勾勒了中国本土汽水的兴衰往事。北四月发朋友圈的句子(适合4月发朋友圈的句子简短)四月发朋友圈的句子(适合4月发朋友圈的句子简短)时间不知不觉地流逝。面对过去的三月,终于说再见了。面对即将到来的四月,先打个招呼。四月份一切都会好起来的。今天小编给大家整理了四月你小米凉席(小米有品悄然上架凉席)小米凉席(小米有品悄然上架凉席)夏天到了,空调凉席成为很多家庭的标配,日前小米米家有品就悄然上架一款凉席,售价99元。其名为床尚天然原木御凉席,选用20年树龄以上原木,还传统草编材艾青儿子(诗人艾青的儿子)艾青儿子(诗人艾青的儿子)细数起来,艾青绝对算最著名的现代诗人之一,他的很多作品都出现在我们初中高中的语文课本中。诗人艾青艾青原名蒋海澄,因发表诗集作品笔名为艾青故以此为名,艾青的乾隆儿子(乾隆有17个儿子)乾隆儿子(乾隆有17个儿子)大家好,我今天百忙之中抽空给大家带来以下这篇文章,欢迎大家一起品鉴!清朝虽然在后期是衰落不堪的,可是在中间,也是有着闻名的康乾盛世的,期间的三位帝王都是草圣张芝(兰州碑林记草圣张芝)草圣张芝(兰州碑林记草圣张芝)大河之上,青峰之巅,兰州碑林巍然屹立。走进碑林,仿佛走进了中国书法的浩瀚长河。兰州碑林,始建于公元2000年,位于黄河之畔,白塔山西峰之巅。兰州碑林赵行李箱哪个牌子质量好(性价比高的拉杆箱品牌)眼看着时间来到六月份,跟六月联系在一起的永远都是毕业季。无论是高考中考还是大学毕业,这都意味着一个新的开始,每个人都将踏上新的旅途。而毕业旅行就成了六月最重要的出行计划,不管是古镇什么红酒最好(智利最顶级的葡萄酒有哪些?)什么红酒最好(智利最顶级的葡萄酒有哪些?)虽然智利葡萄酒以性价比高口感平易近人的特点闻名于全球,但是,在这片美丽狭长的南美大陆上也不缺乏顶尖之作。在两岸三地华语圈享有葡萄酒教父美誉不知道自己想干什么(想换工作又不知道自己适合做什么?)不知道自己想干什么(想换工作又不知道自己适合做什么?)每个月都会遇到一些因为职场问题来咨询的来访者,老师,我是不是该换个工作呢?什么样的工作适合我呢?一般这样的来访者心理都挺迷茫的缩小毛孔(想缩毛孔,你可以从这4个方法入手)缩小毛孔(想缩毛孔,你可以从这4个方法入手)照着镜子,你有没有发现脸上的毛孔越来越大了?毛孔生来就有,但年轻的时候皮肤细嫩基本看不出毛孔的存在,而随着年龄的增长,胶原蛋白流失,还有开个小店(想开个赚钱的小店)开个小店(想开个赚钱的小店)你喜欢什么?准备开店时,最重要的一件事,就是从你喜欢的商品和服务项目着手。经营一家商店,并不是只在进货与顾客周旋,或是商品陈列这些乍看之下轻松愉快的工作