Linux的shell编程前奏之基础技能实战二java
一>监控WEB服务状态,若是访问两次均失败,则报警(let应用案例)。shell
CheckUrl(){ timeout=5 fails=0 success=0 while true do wget --timeout=$timeout --tries=1 http://oldboy.blog.51cto.com -q -o /dev/null if [ $? -ne 0 ] then let fails=fails+1 else let success+=1 fi if [ $success -ge 1 ] then echo success exit 0 fi if [ $fails -ge 2 ] then Critical="sys is down" echo $Critical|tee|mail -s "$Critical" 850034044@qq.com exit 2 fi done } CheckUrl
运行:编程
[root@lll 2019-02-05]# sh -x 2019-02-05checkurl.sh + CheckUrl + timeout=5 + fails=0 + success=0 + true + wget --timeout=5 --tries=1 http://oldboy.blog.51cto.com -q -o /dev/null + '[' 0 -ne 0 ']' + let success+=1 + '[' 1 -ge 1 ']' + echo success success + exit 0
总结:bash
1>let 运算命令的语法格式为:let 赋值表达式 let赋值表达式的功能等同于"((赋值表达式))"less
2>数字之间的断定:ide
-ne为"不等于",-ge为"大于等于",le为“小于等于”url
-eqequalspa
-nenot equal命令行
-gtgreater thanblog
-ltless than
-gegreater than or equal
-leless than or equal
3>多重条件的断定:
-a两个条件同时成立,eg:test -r file a test -x file,同时成立返回true
-o任何一个条件成立,eg:test -r file o test -x file,同时成立返回true
!反向状态,如test!-x file,当file不具备x时,返回true
4>tee命令主要被用来向standout(标准输出流,一般是命令执行窗口)输出的同时也将内容输出到文件,ping baidu.com | tee -a ping-baidu.log
5>mail -s test admin@aispider.com
这条命令的结果是发一封标题为test的空信给后面的邮箱,若是你有mta而且后面的邮箱不会挡这种可能莫名奇妙的信的时候,就能收到这封信了。若是你不想被这种乱七八糟的事情干扰,后面的邮箱请使用本地账户。
二>开发shell脚本,分别实现以脚本传参和read读入的方式比较两个整数的大小。用条件表达式(禁止用if)进行判断并以屏幕输出的方式提醒用户比较的结果。
注意:一共是开发两个脚本。在用脚本传参和read读入的方式实现时,须要对变量是否为数字及传参个数是否正确给予提示。
方案一:采用read方法
#!/bin/sh read -p "please input two num:" a b if [ -z "$a" ] || [ -z "$b" ] &&{#若是$a变量长度为0或者$b长度为零,即任何一个变量为空,则执行命令 echo "please input two num again" exit 1 #以返回值1退出脚本 } expr $a + 10 &>/dev/null #判断$a是否为整数,不输出任何信息(&>) RETVAL1=$? expr $b + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 a $RETVAL2 -eq 0 ||{ echo "please input two number again" exit 2 } [ $a -lt $b] && { echo "$a<$b" exit 0 } [ $a -eq $b] && { echo "$a=$b" exit 0 } [ $a -gt $b] && { echo "$a>$b"
}
总结:
1>shell进程中的特殊状态变量$?判断进程是否执行成功。
2>shell之获取用户输入的命令read,至关于java中的Scanner类。类比和模仿思惟很是重要。用户模仿系统脚本。公司中的新人模仿老师傅的技能。
3>利用以expr作计算时变量或字符串必须是整数的规则,将一个位未知的变量和一个已知的整数相加,返回值为零则认为作加法的变量为整数。
在使用expr时间,要注意:
运算符及用于计算的数字左右都至少有一个空格,不然会报错;
使用乘号时,必须用反斜线屏蔽其特定含义,由于shell可能会误解星号的含义。
方案二:经过命令行传参的方式实现
#!/bin/sh a=$1 b=$2 [ $# -ne 2 ] &&{ echo "USAGE:$0 NUM1 NUM2" exit 1 #以返回值1退出脚本 } expr $a + 10 &>/dev/null RETVAL1=$? expr $b + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 a $RETVAL2 -eq 0 ||{ echo "please input two number again" exit 2 } [ $a -lt $b] && { echo "$a<$b" exit 0 } [ $a -eq $b] && { echo "$a=$b" exit 0 } [ $a -gt $b] && { echo "$a>$b" }
总结:
1>shell中的特殊位置参数变量:
$0 获取当前执行的shell脚本的文件名,若是执行脚本包含了路径,那么就包括脚本路径。
$n 获取当前执行的shell脚本的第n个参数值。
$# 获取当前执行的shell脚本后面接的参数的总个数。
2>shell进程中的特殊状态变量:
$?获取执行上一个指令的执行状态返回值(0为成功,非零为失败)
$$获取当前执行的shell脚本的进程号。
$!获取上一个在后台工做的进程的进程号。