if
1. if的基本语法结构
1.1 基本的几种用法
if [ condition ];then
command
command
fi
if [ condition ];then
command1
else
command2
fi
if [ condition1 ];then
command1
elif [ condition2 ];then
command2
else
command3
fi
if [ condition1 ];then
command1
if [ condition2 ];then
command2
fi
else
if [ condition3 ];then
command3
elif [ condition4 ];then
command4
else
command5
fi
fi
1.2 案例
1.2.1 案例1:当前主机是否与远程主机ping通
思路:
1.使用哪个命令ping -c1
2.参数控制,避免产生交互&>/dev/null
3.命令执行后的状态echo $? 0为真
脚本:
#!/bin/bash
# Name: ping.sh
# Path: /shell01/
# User: yq
#远程主机的ip地址 定义变量,用户自己实现read
read -p "请输入远程主机的ip:" IP
#使用ping 判断是否和远程主机互通
ping -c1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo "当前主机和远程的主机$IP是互通的"
else
echo "当前主机和远程的主机$IP是no互通的"
fi
优化1: 不需提示输入ip 执行脚本的时候直接在后边加上ip
#!/bin/bash
# Name: ping.sh
# Path: /shell01/
# User: yq
#使用ping 判断是否和远程主机互通脚本后边跟参数
ping -c1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "当前主机和远程的主机$1是互通的"
else
echo "当前主机和远程的主机$1是no互通的"
fi
执行:
ping.sh 192.167.3.70
优化2:减少行数:
#!/bin/bash
# Name: ping.sh
# Path: /shell01/
# User: yq
#使用ping 判断是否和远程主机互通脚本后边跟参数
ping -c1 $1 &>/dev/null
[ $? -eq 0 ] && echo "当前主机和远程的主机$1是互通的" || echo "当前主机和远程的主机$1是no互通的"
优化3: 判断没有参数输入不可以执行,直接退出
#!/bin/bash
# Name: ping.sh
# Path: /shell01/
# User: yq
#使用ping 判断是否和远程主机互通脚本后边跟参数
if [ $# -ne 1 ];then
echo "$0 remote_ip" && exit
fi
ping -c1 $1 &>/dev/null
[ $? -eq 0 ] && echo "当前主机和远程的主机$1是互通的" || echo "当前主机和远程的主机$1是no互通的"
1.2.2 案例2:判断一个进程是否存在
思路:
1.查看进程的相关命令
ps -ef
pgrep
ps auxf
pidof
2.根据命令的返回状态$?
3.脚本语言的实现
当然在使用pgrep 的时候,会存在你模糊查询的时候,需要注意,最好采用pidof直接查询进程的pid
#!/bin/bash
# name: pidof.sh
# path:/shell01/
#pidof $1 &>/dev/null
if [ $# -ne 1 ];then
echo "输入错误" && exit
else
pidof $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1进程存在"
else
echo "$1进程不存在"
fi
fi
1.2.3 案例3:判断一个服务是否正常
#!/bin/bash
wget http://10.1.1.2 &>/dev/null
[ $? -eq 0 ] && echo "该web服务是正常的" && rm -f /shell/shell01/index.* || echo "该web服务异常请检查"
1.2.4 输入一个用户,用脚本判断该用户是否存在
read -p "请输入需要判断的用户名:" user
id $user &>/dev/null
test $? -eq 0 && echo "该$user存在" || echo "该$user不存在"
1.2.5 判断vsftpd软件包是否安装,如果没有则自动安装(yum源已配好)
#!/bin/bash
rpm -q vsftpd &> /dev/null
if [ $? -eq 0 ];then
echo "vsftpd已经安装"
else
echo "该软件包没有安装,正在安装...."
yum install -y vsftpd &> /dev/null
if [ $? -eq 0 ];then
echo "vsftpd安装成功"
else
echo "vsftpd安装失败"
fi
fi
判断当前内核主版本是否为2,且次版本是否大于等于6;如果都满足则输出当前内核版本
思路:
1. 先查看内核的版本号 uname -r
2. 先将内核的版本号保存到一个变量里,然后再根据需求截取出该变量的一部分:主版本和次版本
3. 根据需求进步判断
#!/bin/bash
kernel=`uname -r`
var1=`echo $kernel|cut -d. -f1`
var2=`echo $kernel|cut -d. -f2`
test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "当前内核版本不符合要求"
或者
[ $var1 -eq 2 -a $var2 -ge 6 ] && echo $kernel || echo "当前内核版本不符合要求"
或者
[[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || echo "当前内核版本不符合要求"
或者
#!/bin/bash
kernel=`uname -r`
test ${kernel:0:1} -eq 2 -a ${kernel:2:1} -ge 6 && echo $kernel || echo '不符合要求'
其他命令参考:
uname -r|grep ^2.[6-9] || echo '不符合要求'
判断ftp服务是否已启动,如果已启动输出以下信息:
参考1:
#!/bin/bash
service vsftpd status &>/dev/null
if [ $? -eq 0 ];then
port=`netstat -tnltp|grep vsftpd|cut -d: -f2|cut -d' ' -f1`
pid=`pgrep -l vsftpd|cut -d ' ' -f1`
echo -e "vsftpd服务器已启动...\nvsftpd监听的端口是:$port\nvsftpd的进程PID是:$pid"
else
service vsftpd start &>/dev/null
port=`netstat -tnltp|grep vsftpd|cut -d: -f2|cut -d' ' -f1`
pid=`pgrep -l vsftpd|cut -d ' ' -f1`
echo -e "vsftpd服务器已启动...\nvsftpd监听的端口是:$port\nvsftpd的进程PID是:$pid"
fi
参考2:
[root@server shell02]# cat liufeng.sh
#!/bin/bash
service $1 status
if [ $? -eq 0 ];then
echo " '$1'服务器已启动..."
a=$( netstat -tnulp | grep $1 )
array=($a)
echo "$1的监听端口是:$(echo ${array[3]} | cut -d: -f2) "
echo "$1的进程ID为:$(echo ${array[6]}| cut -d/ -f1)"
else
echo "$1进程未启动!"
fi
参考3:
vim /lt/2.sh
#! /bin/bash
duankou=`netstat -ntlp|grep vsftpd|cut -d: -f2|cut -d" " -f1`
pid=`pgrep -o vsftpd`
vim 1.sh
pgrep -l vsftpd >/dev/null
if [ $? -eq 0 ];then
echo "vsftpd服务器已启动..."
echo "vsftpd监听的端口是:$duankou"
echo "vsftpd的进程PID是:$pid"
else
echo "vsftpd服务器没启动"
service vsftpd start
source /lt/2.sh
fi