天天看点

Shell脚本----条件判断逻辑控制—条件判断

文章目录

  • 逻辑控制---条件判断
    • 一、条件判断的实现
    • 二、if的简单结构
      • 1、条件的写法
        • 1)、数字表达式
        • 2)、字符表达式
        • 3)文件目录表达式
      • 2、单分支if
      • 3、多分支if
        • 1)、多条件的写法
      • 4、嵌套if
      • 5、case条件判断
        • 1)、位置变量

逻辑控制—条件判断

一、条件判断的实现

  • if
  • case

二、if的简单结构

if 条件 ; then
	执行的操作
	执行的操作
fi
           

1、条件的写法

  • shell 命令
    • 判断命令的执行状态码
  • [ 表达式 ]
    • 数字表达式
    • 字符表达式
    • 文件目录表达式

1)、数字表达式

  • [ 数字 -eq 数字 ] 等于
  • [ 数字 -ne 数字 ] 不等于
  • [ 数字 -gt 数字 ] 大于
  • [ 数字 -ge 数字 ] 大于等于
  • [ 数字 -lt 数字 ] 小于
  • [ 数字 -le 数字 ] 小于等于

(1)、数字表达式脚本示例

  • 自动挂载光盘
#!/bin/bash
#

mount -a &> /dev/null
if df -Th | grep "iso9660" &> /etc/null ; then
        mount_dir=$(df -Th | grep "iso9660" | awk '{print $7}')
        echo "光盘已挂载到$mount_dir"
else
        sed -ri '$a \/dev/sr0 /mnt/ iso9660 defaults 0 0' /etc/fstab
        mount -a &> /dev/null
        mount_name=$(df -Th | grep "iso9660" | awk '{print $1}')
        echo "已成功挂载光盘$mount_name"
fi
           
  • 自动创建用户
#!/bin/bash/
#

read -p "请输入用户名:" user
read -p "请输入密码" passwd
grep "^$user:" /etc/passwd &> /etc/null
if [ $? -ne 0 ]; then
        useradd $user
        echo $passwd | passwd --stdin $user &> /etc/null
        echo "$user用户创建成功"
else
        echo "$user已存在"
fi
           
  • 判断用户UID与组ID是否一致
#!/bin/bash/
#

read -p "请输入用户名:" user
grep "^$user:" /etc/passwd &> /etc/null
id_num=$(id $user -u)
grp_num=$(id $user -g)
if [ $id_num -eq $grp_num ]; then
        echo "Good,用户ID与组ID一致!"
else
        echo "No,用户ID与组ID不一致!"
fi
           
  • 获取磁盘使用率超过则报警
#!/bin/bash
#

usage=$(df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
if [ $usage -ge 60 ]; then
        echo "警告!警告!当前目录使用率为:${usage}% ,目录磁盘使用率超过60%!!!"
else
        echo "当前目录使用率为:${usage}%, 根目录使用率未超过60%"
fi

           

2)、字符表达式

  • == 两个字符相等
  • != 不等
  • [ -z 字符 ] 判断字符是否为空字符
  • 在shell脚本中空格也是代表某一个字符,如果想在if语句条件判断中加入空格,需要将 “条件判断” 加双引号

(1)字符表达式脚本示例

#!/bin/bash
#

read -p "请输入密码:" pwd1
read -p "确认密码:" pwd2
if [ "$pwd1" == "$pwd2" ]; then
        echo "密码修改成功!"
else
        echo "密码不一致!"
fi    
           

3)文件目录表达式

  • [ -e 文件目录名称 ] 判断文件目录是否存在
  • [ -f 文件名称 ] 判断文本文件
  • [ -d 文件名称 ] 判断是否为目录
  • [ -b 文件名称 ] 判断是否为块设备文件
  • [ -l 文件名称 ]
  • [ -s 文件名称 ]
  • [ -r 文件名称 ] [ -w 文件名称 ] [ -x 文件名称 ]

所有单目表达式支持使用!取反 [ ! -e /opt/file01 ]

2、单分支if

if 条件; then
    执行的操作
    执行的操作
else
	执行的操作
	执行的操作
fi
           

3、多分支if

if 条件1; then
	执行的操作
	执行的操作 
elif 条件2; then 
	执行的操作
	执行的操作
elif 条件3; then 
	执行的操作
	执行的操作
else
	执行的操作
	执行的操作
fi 
           

1)、多条件的写法

  • 注意多条件只要有一个符合条件就会退出
  • and 并且
    • [ 条件1 -a 条件2 ]
    • [ 条件1 ] && [ 条件2 ]
  • or 或者
    • [ 条件1 -o 条件2 ]
    • [ 条件1 ] || [ 条件2 ]

(1)多条件脚本示例

  • 判断用户输入

    Linux, linux 显示redhat

    windows, Windows, 显示Microsoft

    mac, MAC, 显示apple

    显示其他

#!/bin/bash
#
echo "----选择下列的系统----"
echo "Linux、linux"
echo "windows、Windows"
echo "mac、MAC"
echo "----------------------"
read -p "请输入系统:" system
if [ $system == linux -o $system == Linux ]; then
        echo 
        echo "该系统为:RedHat System"
elif [ $system == windows -o $system == Windows ]; then
        echo
        echo "该系统为:Microsoft System"
elif [ $system == mac -o $system == MAC ]; then
        echo
        echo "该系统为:Apple System"
else
        echo "其他操作系统"
           

4、嵌套if

  • 适用于多层判断
if  条件; then
      if  条件; then
             执行的操作
             执行的操作
      else
             执行的操作
             执行的操作
      fi
else
        执行的操作
        执行的操作
fiw
           

1)嵌套脚本示例

  • 删除文件的空行和注释行
#!/bin/bash
#

read -p "请输入要过滤的源文件:" file_name
if [ -e $file_name ];  then
	if grep "^$" $file_name &> /dev/null; then
		Hnumber=$(grep -n "^$" $file_name)
		echo "空行的行号为:"
		echo $Hnumber
		sed -i -e '/^$/d' -e '/^#/d'  $file_name
		echo "删除空行后的文件为:"
		echo
		cat $file_name
	fi
else 
	echo "源文件不存在!"
fi

           

5、case条件判断

  • 适用于判断某个变量有多种固定的取值时
case  变量 in 
值1)
     执行的操作
     执行的操作
     ;; 
值2)
      执行的操作 
      执行的操作
      ;; 
值3)
    执行的操作 
    执行的操作
    ;; 
*)
    执行的操作 
    执行的操作
    ;; 
esac
           

1)、位置变量

  • $1 $2 $3 $4…$9 ${10}
    • $1 命令第一个参数,$2第二个参数
    • $0 命令自身
    • $#
      • 参数的个数
  • case脚本示例
#!/bin/bash
#
if [ $# -eq 0 ]; then
        echo "命令输入错误,帮助信息: $0 <linux|Linux|windows|Windows|mac|MAC>"
        exit 78
fi

case $1 in
        linux|Linux)
        echo "RedHat"
        ;;
        windows|Windows)
        echo "Microsoft"
        ;;
        mac|MAC)
        echo "Apple"
        ;;
        *)
        echo "Others"
        ;;
esac
           
  • 位置变量脚本示例
1 #!/bin/bash
  2 #
  3 
  4 nginx_file=/usr/local/nginx/sbin/nginx
  5 nginx_pid=/usr/local/nginx/logs/nginx.pid
  6 
  7 if [ -z $1 ]; then
  9         exit 100
 10 fi
 11 
 12 case $1 in
 13         start)
 14         if [ -e $nginx_pid ]; then
 15                 echo "Nginx 正在运行"
 16         else
 17                 $nginx_file
 18                 if [ $? -eq 0 ]; then
 19                         echo "Nginx 启动成功"
 20                 else
 21                         echo "Nginx 启动失败"
 22                 fi
 23         fi
 24         ;;
 25         stop)
 26         if [ -e $nginx_pid ]; then
 27                 $nginx_file -s stop
 28                 if [ $? -eq 0 ]; then
 29                         echo "Nginx 成功停止"
 30                 else
 31                         echo "Nginx 停止失败"
 32                 fi
 33         else
 34                 echo "Nginx 未在运行"
 35         fi
 36         ;;
 37         reload)
 38         kill -1 $(cat $nginx_pid)
 39         if [ $? -eq 0 ]; then
 40                 echo "Nginx 成功重新加载"
 41         else
 42                 echo "重新加载失败"
 43         fi
 44         ;;
 45         restart)
 46         if [ -e $nginx_pid ]; then
 47                 $nginx_file -s stop
 48                 if [ $? -eq 0 ]; then
 49                         echo "Nginx 正在重新启动"
 50                 else
 51                         echo "Nginx 启动失败!!"
 52                 fi
 53                 sleep 1
 54                 $nginx_file
 55                 if [ $? -eq 0 ]; then
 56                         echo "Nginx 重新启动成功"
 57                 else
 58                         echo "Nginx 重新启动失败"
 59                 fi
 62                 $nginx_file -s stop
 63                 if [ $? -eq 0 ]; then
 64                         echo "Nginx 正在重新启动"
 65                 else
 66                         echo "Nginx 启动失败!!"
 67                 fi
 68                 sleep 1
 69                 $nginx_file
 70                 if [ $? -eq 0 ]; then
 71                         echo "Nginx 重新启动成功"
 72                 else
 73                         echo "Nginx 重新启动失败"
 74                 fi
 75         fi
 76         ;;
 77         status)
 78         if [ -e $nginx_pid ]; then
 79                 echo "Nginx PID's $(cat $nginx_pid) 正在运行"
 80         else
 81                 echo "Nginx 已经停止"
 82         fi
 83         ;;
 84         start_auto)
 85         chmod a+x /etc/rc.d/rc.local
 87         if [ $? -eq 0 ]; then
 88                 echo "正在写入开机自启配置文件中......"
 89                 source /etc/rc.d/rc.local
 90                 if [ $? -eq 0 ]; then
 91                         echo "Nginx 成功开机自启!"
 92                 fi
 93         else
 94                 echo "写入开机自动配置文件失败!!!"
 95         fi
 96         ;;
 97         Cancel_startup)
 98         if grep "nginx" /etc/rc.d/rc.local &> /dev/null; then
 99                 echo "正在取消开机自启"
100                 sed -ri '/nginx/d' /etc/rc.d/rc.local
101                 if [ $? -eq 0 ]; then
102                         echo "成功取消开机自启"
103                 else
104                         echo "取消开机自启失败!!!"
105                 fi
106         else
107                 echo "Nginx 目前开机不自启"
108         fi
109         ;;
110         *)
111         echo "帮助:$0 <status|start|stop|reload|restart>"
112         exit 101
113         ;;
114 esac
           

继续阅读