Linux的shell编程前奏之基础技能实战二

                                                                                        Linux的shell编程前奏之基础技能实战二

一>监控WEB服务状态,如果访问两次均失败,则报警(let应用案例)。

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" [email protected]
                        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

总结:

1>let 运算命令的语法格式为:let 赋值表达式      let赋值表达式的功能等同于"((赋值表达式))"

2>数字之间的判定:

-ne为"不等于",-ge为"大于等于",le为“小于等于”

-eqequal

-nenot equal

-gtgreater than

-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 [email protected]

这条命令的结果是发一封标题为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脚本的进程号。

$!获取上一个在后台工作的进程的进程号。



















































猜你喜欢

转载自blog.51cto.com/11218855/2348961