shell if 的语句

作者: print("") 分类: linux 发布时间: 2017-05-22 09:34

if 语法大概就是前面的的条件是真的、就可以运行下面那个指令或者指令集、如果不满足条件就可以执行不满足的指令或者指令集
1) 单分支结构
语法:
if [条件]
then
指令
fi
或者
if [条件];then
指令
fi
提示:分号相当于命令行换行,上面两种语法等同
特殊写法 if [ -f “$file1” ]; then echo 1;else echo 0;fi
 
2)双分支结构
语法
if 条件
then
指令集
else
指令集
fi
3)多分支结构
语法
if [条件]
then
指令
elif 条件
then
指令
………….[多种指令]
else
指令
fi
if条件句举例
范例1:单分支if语句整数比较大小 各种语法、上面两种有错误
范例2:双分支结构if语句比较大小  这个是命令行传参比较大小 范例3 、多分例if语句简单实现方法 如果输入的是字母我们怎么操作它的一个错误提示呢? 这个方法是表示需要输入数字的提示
多分支if语句严格判断的方法。
#!/bin/sh
print_usage(){
echo   “您输入的数字不对或有误、请按下面语法执行:\n”
echo -e “$0 数字1 数字2”
exit 1
}
 
if [ $# -ne 2 ]
then
print_usage
fi
[ -n “`echo $1|sed ‘s/[0-9]//g’`” -a -n “`echo $2 ‘s/[0-9]//g’`” ] &&
echo “两个参数必须为数字” && exit 1
[ -n “`echo $1|sed ‘s/[0-9]//g’`”  ] &&
echo  “第一个参数为数字” && exit 1
[ -n “`echo $2|sed ‘s/[0-9]//g’`”  ] &&
echo  “第二个参数为数字” && exit 1
 
if [ $1 -gt $2  ]
then
echo ” $1 > $2″
elif [ $1 -eq $2 ]
then
echo “$1 = $2”
else
echo “$1 < $2”
fi [ -n “`echo $1|sed ‘s/[0-9]//g’`”   意思就是echo 一个变量如果变量去掉数字之后为空就为真
就执行下一步的操作。
思路: 如果参数内容长度不为0,把参数内容的非数字删除、然后看结果是不是为空、来判断是不是数字。 测试一下你的脚本
扩展:判断字符串是否为数字的三种方法
法一:sed加正则表达式
命令行传参:
组合语法1、
[  -n “`echo $num|sed ‘s/[0-9]//g’`” –a –n “`echo $2|sed ‘s/[0-9]//g’`” ] && \
echo ”两个参数都必须为数字” && exit 1
或者
[  -n “`echo $num|sed ‘s/[0-9]//g’`” –a –n “`echo $2|sed ‘s/[0-9]//g’`” ] && {
echo ”两个参数都必须为数字”
exit
}
单个判断语法
[  -n “`echo $num|sed ‘s/[0-9]//g’`” ] && echo “第一个参数必须为数字” && exit 1
法二:变量子串替换加正则表达式 脚本设置mysql关闭自动开启
写脚本前首先人工检查:
[root@mail2 local]# netstat -nltp |grep 3306
tcp        0      0 :::3306                     :::*                        LISTEN      30240/mysqld
[root@mail2 local]# ps -ef |grep mysql|grep -v grep|wc –l  ####通过这个进程转换的行数、即为进程个数、方便做判断
2
[root@mail2 local]# netstat -nltp |grep 3306|wc –l     ###通过把端口转换为行数、即端口个数、
1
提示:根据结果我们知道mysql服务是正常的、(一般情况下)
方法一:
 
#!/bin/sh
#date :2017-3-30
##this is mysql start done sh
MySQLTARTUP=”/etc/init.d/mysqld”
DbProcessCount=`ps -ef |grep mysqld |grep -v grep |wc -l`
DbportCount=`netstat -ntlp|grep 3306|wc -l`
if [ $DbProcessCount -eq 2 ] && [ $DbportCount -eq 1 ]   ##如果进程为2个和端口在的话,进行下一步
then
echo “MySQL is runing”      ####如果进程端口在的话直接输出 mysql正在运行
else
echo “MySQL is stop”         ###如果上面的两个条件不满足直接输入mysql已经关闭了
$MySQLTARTUP start >/tmp/mysql.log     #####启动mysql 另外把日志放入log中
sleep 10                    ####休息十秒
if  [ $DbProcessCount -ne 2 ] || [ $DbportCount -ne 1 ]    ###判断进程是是两个、和进程端口是否是两个
then
killall mysqld >/dev/null 2>&1   ####如果上面的成立、直接杀死mysql进程
sleep 5                        ###休息5秒
killall mysqld >/dev/null 2>&1     #####直接杀死mysql进程
sleep 5                       ###休息5秒
killall mysqld >/dev/null 2>&1       #####直接杀死mysql进程
sleep 5           ###休息5秒
[ $DbProcessCount -eq 0 ] && $MySQLTARTUP start >>/tmp/myslq.log  ###进程为0 后面启动mysql
[  $? -eq 0 ] && echo “Myslq is started”      #####没有报错直接输出mysql启动成功
mail -s “mysql restarted ” 1249648969@qq.com </tmp/mail.log
fi
fi
 
 
提示:[  $? -eq 0 ] && echo “Myslq is started”   这个判断不是很严谨
可以再使用一次上面的判断
if  [ $DbProcessCount -ne 2 ] || [ $DbportCount -ne 1 ]    ###判断进程是是两个、和进程端口是否是两个
then
killall mysqld >/dev/null 2>&1   ####如果上面的成立、直接杀死mysql进程
sleep 5                        ###休息5秒
killall mysqld >/dev/null 2>&1     #####直接杀死mysql进程
sleep 5                       ###休息5秒
killall mysqld >/dev/null 2>&1       #####直接杀死mysql进程
sleep 5           ###休息5秒
 
方法二:模拟web服务器、通过mysql账号连接mysql根据返回状态户返回内容确定mysql是否正常(推荐使用)
另外的思路:通过web服务的URL访问数据库来判断也可以。
[root@mail2 sh]# mysql -uroot -p’123456′ -e “select version();”
Warning: Using a password on the command line interface can be insecure.
+———–+
| version() |
+———–+
| 5.6.17    |
+———–+
[root@mail2 sh]# mysql -uroot -p’123456′ -e “select version();” >/dev/null 2>&1 |wc -l
0
这个等于0 说明启动之后0是启动的
那么不等于0就是不正常的、
#!/bin/sh
MysqlSTART=”/etc/init.d/mysqld”
mysql -uroot -p’123456′ -e “select version();” >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo “MySQL is runing”
else
$MysqlSTART start >/tmp/mysql2.log
sleep 10
mysql -uroot -p’123456′ -e “select version();” >/dev/null 2>&1
if [ $? -eq 0 ]
then
killall mysqld >/dev/null 2>&1
sleep 3
killall mysqld >/dev/null 2>&1
sleep 3
killall mysqld >/dev/null 2>&1
sleep 3
killall mysqld >/dev/null 2>&1
$MysqlSTART start >>/tmp/mysql2.log
fi
mail -s “maill restarted ” 1249648969@qq.com > /tmp/mysqlliang.log
fi
 
更专业的脚本
#!/bin/sh
MySQLSTART=”/etc/init.d/mysqld”
USER=root
PASSWORD=”123456″
LOG_PATH=/tmp
LOG_FILE=${LOG_PATH}/mysqllogs_1`date +%F`.log
MYSQL_PATH=/usr/local/mysql/bin
MYSQL_CMD=”$MYSQL_PATH/mysql -u$USER -p$PASSWORD”
$MYSQL_CMD -e “select version();” >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo “MySQL is runing!”
exit
else
$MySQLSTART restart >>$LOG_FILE
sleep 5
$MYSQL_CMD -e “select version();” >/dev/null 2>&1
if [ $? -eq 0 ]
then
for unm in `seq 5`
do killall mysqld >/dev/null 2>&1
[ $? -eq 0 ] && break;
sleep 1
done
$MySQLSTART restart >>$LOG_FILE
$MYSQL_CMD -e “select version();” >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo “MySQL is runing!”
exit
else
echo “Mysql is stop”
fi
mail -s ” MySQL status is $Status” 1249648969@qq.com <$LOG_FILE
fi
fi
exit
测试一下效果: 已经成功了。
多判断条件if语句(&& 、 || )

  • && 两端条件都满足才为真、即为表示 与

[root@mail2 sh]# cat duopan.sh
#!/bin/sh
d=2
e=3
#if [ #? -eq 0 ] -a [ $d -eq 2 ] -a [ $e -lt 5 ];then
 
if [[ $?=0 ]] && [[ $d=2 ]] && [[ “$e”<“5” ]];then
echo “true”
fi
[root@mail2 sh]# sh duopan.sh
true
如果是|| 条件的话一段满足就为真
Httpd 脚本
[root@mail2 ~]# netstat -nltp |grep 80 |grep -v grep|wc -l
0
[root@mail2 ~]# ps -ef |grep httpd|grep -v grep|wc -l
1
这两个是条件
#!/bin/sh
. /etc/init.d/functions
LOG_FILE=/tmp/httpd.log
apachectl=”/usr/local/apache/bin/apachectl”
HTTPPOSTNMU=`netstat -nltp |grep 80 |grep -v grep|wc -l`
HTTPHTTP=`ps -ef |grep httpd|grep -v grep|wc -l`
wget –quiet –spider http://www.lkq.com && RETVAL=$?
[ ! -f $LOG_FILE  ] && touch $LOG_FILE
action “httpd is not runing” /bin/false
echo -e “httpd is not runing\n” >$LOG_FILE
echo “Preparing start apache……”
for num in `seq 10`
do
killall httpd >/dev/null 2>&1
[  $? -ne 0 ] && {
echo “httpd is killed” >$LOG_FILE
break;
}
sleep 2
done
$apachectl start >/dev/null 2>&1 && status=”started” || status=”uknown”
[  “status”=”started” ] && action “httpd is started” /bin/true||\
action “start is started” /bin/false
mail -s `uname -n` “httpd status is $status” 1249648969@qq.com <$LOG_FILE
exit
else
action “httpd is runing” /bin/true
exit 0
fi
functions 的应用
#!/bin/sh
. /etc/init.d/functions
[ “liang”=”liang” ]\
&& action “I am liang” /bin/true\
||action “I am  not liang” /bin/false

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注