shell脚本—if语句

shell脚本—if语句

文章目录

  • shell脚本—if语句
    • 1.什么是if
    • 2.if算数比较运算符(整数比较)
    • 3.if字符串比较运算符(字符串需要加引号)
    • 4.if文件比较与检查(-f -d -e ...... )
    • 5.if的基础语法
      • 3.1基于文件的条件比对
      • 3.2流程控制语句if整数比对
      • 3.3 if基于字符比较
      • 3.4 if判断练习

1.什么是if

if是模仿人类的判断来进行的,只有true和false两种结果

2.if算数比较运算符(整数比较)

比较字符 含义 示例
-eq 等于则条件为真 [ 1 -eq 10 ]
-lt 小于则条件为真 [ 1 -lt 10 ]
-le 小于等于则条件为真 [ 1 -le 10 ]
-ne 不等于则条件为真 [ 1 -ne 10 ]
-gt 大于则条件为真 [ 1 -gt 10 ]
-ge 大于等于则条件为真 [ 1 -ge 10 ]

3.if字符串比较运算符(字符串需要加引号)

比较字符 含义 比较字符 含义
== 相等 != 不等
-n 检查字符串长度是否大于0 -z 检查字符串长度是否为0

4.if文件比较与检查(-f -d -e … )

文件比较运算符 含义 示例
-e 如果文件或目录存在,则为真 [ -e /var/log/syslog ]
-d 如果文件存在且为目录,则为真 [ -d /tmp/mydir ]
-f 如果文件存在且为文件,则为真 [ -f /usr/bin/grep ]
-L 如果文件存在文件为符号链接,则为真 [ -L /usr/bin/grep ]
-r 如果文件存在文件且可读,则为真 [ -r /var/log/syslog ]
-w 如果文件存在文件且可写,则为真 [ -w /var/mytmp.txt ]
-x 如果文件存在且为可执行文件,则为真 [ -x /usr/bin/grep.sh ]
-nt 如果文件1比 文件2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
-ot 如果文件1 比文件2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

5.if的基础语法

1.单分支结构

#单分支语法                  单分支代码示例
if [ 如果你有房 ];then       if [ $1 -eq $2 ];then
     我们就结婚                   echo "ok"
fi                         fi

2.双分支结构

#双分支结构                  双分支代码示例
if [ 如果你有房 ];then       if [ $1 -eq $2 ];then
     我就嫁给你                   echo "ok!"
else                        else
      拜拜!                     echo "err!"
fi                          fi

3.多分支结构

#多分支结构
if [ 如果你有房 ];then
     我就嫁给你
elif [ 如果你有车 ];then
     我就嫁给你
elif [ 如果你有钱 ];then
     我就嫁给你
else
      拜拜!
fi
#需求1:输入成绩,显示及格优秀
[root@manage if]# cat var02.sh 
#!/bin/bash
read -p "成绩查询入口,请输入你的成绩:" cj

if [ $cj -lt 60 ];then
     echo "成绩不及格......."
elif [ $cj -gt 80 ];then
     echo "成绩优秀........."
else
     echo "要好好学习......."
fi

[root@manage if]# sh +x var02.sh 
成绩查询入口,请输入你的成绩:56
成绩不及格.......
[root@manage if]# sh +x var02.sh 
成绩查询入口,请输入你的成绩:88
成绩优秀.........
[root@manage if]# sh +x var02.sh 
成绩查询入口,请输入你的成绩:70
要好好学习.......
#需求2:根据输入一个用户名称,   read  $1   <--test
	1.判断输入的用户是否存在当前系统,
	2.如不在再次判断用户是否在/home下拥有家目录
	3.如果都没有则提示不存在。
	
#方法1:
[root@manage if]# cat var03.sh 
#!/bin/bash
if grep $1 /etc/passwd &>/dev/null;then
     echo "$1用户存在于系统中"
elif ls -ld /home/$1 &>/dev/null;then
     echo "$1用户不存在于系统中,但有家目录"
else
     echo "$1用户不存在系统中,也没有家目录"
fi

[root@manage if]# useradd ttt
[root@manage if]# sh -x var03.sh ttt
+ grep ttt /etc/passwd
+ echo ttt用户存在于系统中
ttt用户存在于系统中
[root@manage if]# userdel ttt
[root@manage if]# sh -x var03.sh ttt
+ grep ttt /etc/passwd
+ ls -ld /home/ttt
+ echo ttt用户不存在于系统中,但有家目录
ttt用户不存在于系统中,但有家目录
[root@manage if]# rm -rf /home/ttt/
[root@manage if]# sh -x var03.sh ttt
+ grep ttt /etc/passwd
+ ls -ld /home/ttt
+ echo ttt用户不存在系统中,也没有家目录
ttt用户不存在系统中,也没有家目录

#方法2:
[root@manage if]# cat var03.sh 
#!/bin/bash
grep_user=$(grep $1 /etc/passwd &>/dev/null)
grep_rc=$?

cat_dir=$(ls -ld /home/$1 &>/dev/null)
cat_rc=$?

if [ $grep_rc -eq 0 ];then
     echo "$1用户存在于系统中"
elif [ $cat_rc -eq 0 ];then
     echo "$1用户不存在于系统中,但有家目录"
else
     echo "$1用户不存在系统中,也没有家目录"
fi


[root@manage if]# sh -x var03.sh root
++ grep root /etc/passwd
+ grep_user=
+ grep_rc=0
++ ls -ld /home/root
+ cat_dir=
+ cat_rc=2
+ '[' 0 -eq 0 ']'
+ echo root用户存在于系统中
root用户存在于系统中

#需求3:通过脚本传入两个参数,进行整数关系比较。
#比如: var04.sh [ 1 2 | 2 2 | 2 3 ],请使用双分支和多分支两种方式实现。
#第一种:多分支实现
[root@manage if]# cat var04.sh 
#!/bin/bash
if [ $1 -eq $2 ];then
      echo "$1 = $2"
elif [ $1 -lt $2 ];then
      echo "$1 < $2"
else
      echo "$1 > $2"
fi

[root@manage if]# sh var04.sh 2 3
2 < 3
[root@manage if]# sh var04.sh 3 2
3 > 2
[root@manage if]# sh var04.sh 3 3
3 = 3

#第二种:双分支实现
[root@manage if]# cat var05.sh 
#!/bin/bash
if [ $1 -eq $2 ];then
    echo "$1 = $2"
else
     if [ $1 -lt $2 ];then
       echo "$1 < $2"
     else
       echo "$1 > $2"
     fi
fi

[root@manage if]# sh var05.sh 1 2
1 < 2
[root@manage if]# sh var05.sh 2 1
2 > 1
[root@manage if]# sh var05.sh 2 2
2 = 2

3.1基于文件的条件比对

#需求1:备份/etc/hosts 文件到指定的目录下(先判断目录存在不存在,不存在则创建)
[root@manage if]# cat var06.sh 
#!/bin/bash
read -p "请输入要备份的文件:" src
read -p "请输入备份的目标目录:" desc
[ -d $desc ] || mkdir -p $desc
cp -rp $src $desc

[root@manage if]# sh -x var06.sh 
+ read -p 请输入要备份的文件: src
请输入要备份的文件:/etc/hosts
+ read -p 请输入备份的目标目录: desc
请输入备份的目标目录:/opt/ttt/qqq/test/
+ '[' -d /opt/ttt/qqq/test/ ']'
+ mkdir -p /opt/ttt/qqq/test/
+ cp -rp /etc/hosts /opt/ttt/qqq/test/

#需求2:备份mysql,手动输入你需要备份的库名称, 备份到输入目录/时间/xx.sql
[root@manage if]# cat var07.sh 
#!/bin/bash
mysql -uroot -pzabbix -e "show databases"
read -p "请输入要备份的库名: " dbname
read -p "请输入要备份的目标位置:" desc
Date=$(date +%F)
Path=${desc}/${Date}
[ -d  ${Path} ] || mkdir -p ${Path}
mysqldump -uroot -pzabbix -B $dbname > ${Path}/$dbname.sql

[root@manage if]# sh -x var07.sh 
+ mysql -uroot -pzabbix -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| zabbix             |
+--------------------+
+ read -p '请输入要备份的库名: ' dbname
请输入要备份的库名: mysql
+ read -p 请输入要备份的目标位置: desc
请输入要备份的目标位置:/backup/mysql/
++ date +%F
+ Date=2022-04-16
+ Path=/backup/mysql//2022-04-16
+ '[' -d /backup/mysql//2022-04-16 ']'
+ mkdir -p /backup/mysql//2022-04-16
+ mysqldump -uroot -pzabbix -B mysql

[root@manage if]# ll /backup/mysql/2022-04-16/mysql.sql 
-rw-r--r-- 1 root root 515152 Apr 16 19:02 /backup/mysql/2022-04-16/mysql.sql


#方法2,不输入库名和目标目录
[root@manage if]# cat var07.sh 
#!/bin/bash
Date=$(date +%F)
Path=/date/backup/mysql/${Date}
#判断目标目录是否存在,如果不存在就创建
[ -d /date/backup/mysql/${Date} ] || mkdir -p /date/backup/mysql/${Date}
#执行备份命令
mysqldump -uroot -pzabbix -B mysql> ${Path}/mysql.sql

[root@manage if]# sh -x var07.sh 
++ date +%F
+ Date=2022-04-16
+ Path=/date/backup/mysql/2022-04-16
+ '[' -d /date/backup/mysql/2022-04-16 ']'
+ mkdir -p /date/backup/mysql/2022-04-16
+ mysqldump -uroot -pzabbix -B mysql
[root@manage if]# ll /date/backup/mysql/2022-04-16/mysql.sql 
-rw-r--r-- 1 root root 515152 Apr 16 18:53 /date/backup/mysql/2022-04-16/mysql.sql

3.2流程控制语句if整数比对

比较字符 含义 示例
-eq 等于则条件为真 [ 1 -eq 10 ]
-lt 小于则条件为真 [ 1 -lt 10 ]
-le 小于等于则条件为真 [ 1 -le 10 ]
-ne 不等于则条件为真 [ 1 -ne 10 ]
-gt 大于则条件为真 [ 1 -gt 10 ]
-ge 大于等于则条件为真 [ 1 -ge 10 ]

语法示例

#等于
[root@manage if]# [ 1 -eq 1 ] && echo $?
0
[root@manage if]# [ 1 -eq 2 ] && echo $?

#大于等于
[root@manage if]# [ 11 -ge 1 ] && echo "成立" || echo "不成立"
成立

#小于
[root@manage if]# [ 11 -lt 1 ] && echo "成立" || echo "不成立"
不成立

#不等于
[root@manage if]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立

#需求1:用户执行脚本,sh status.sh nginx,则检查nginx服务的运行状态。(仅支持传递一个参数)
	1.检查nginx状态  systemctl status nginx
	2.状态结果非0 则提示未启动
	3.状态结果为0 则提示已启动
	
[root@manage if]# cat var08.sh 
#!/bin/bash
#1.控制传参的个数为一个
if [ $# -ne 1 ];then
    echo "USAGE: $0 {nginx | rsyncd | sshd | all service name}"
    exit
fi

systemctl status $1 &>/dev/null
rc=$?
if [ $rc -eq 0 ];then
      echo "$1 已启动"
else
      echo "$1 未启动"
fi

[root@manage if]# sh  var08.sh nginx
nginx 未启动
[root@manage if]# sh  var08.sh sshd
sshd 已启动

#需求2:查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件
[root@manage if]# cat var09.sh 
#!/bin/bash

disk_user=`df -h |awk '/\/$/ {print $(NF-1)}'`
#此处需要用/将磁盘的%号去掉
if [ ${disk_user%\%} -ge 80 ];then
    echo "邮件报警中...."
    sleep 5
    echo "邮件发送完成,当前磁盘使用率为:${disk_user}"
fi

[root@manage if]# sh +x var09.sh 
邮件报警中....
邮件发送完成,当前磁盘使用率为:90%

#需求3:单分支,判断当前用户是不是root,如果不是那么返回“ERROR”
#1.通过整数比对
[root@manage if]# cat var10.sh 
#!/bin/bash
if [ $UID -ne 0 ];then
     echo "ERROR"
     exit
fi

#2.通过字符比对
[root@manage if]# cat var11.sh 
#!/bin/bash
if [ $USER != "root" ];then
     echo "ERROR"
     exit
fi

#需求4:双分支,判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“
[root@manage if]# cat var12.sh 
#!/bin/bash
if [ $UID -eq 0 ];then
     echo "hey admin"
else
     echo "hey guest"
fi

#需求5:备份filename文件至/backup/system/filename-2022-04-16,如果该目录不存在则自动创建
[root@manage if]# cat var13.sh 
#!/bin/bash
read -p "请输入要备份的文件:" file
Date=$(date +%F)
Desc=/backup/system
[ -d ${Desc} ] || mkdir -p $Desc
cp -rpv $file $Desc/filename-${Date}

[root@manage if]# sh +x var13.sh 
请输入要备份的文件:/etc/hosts
‘/etc/hosts’ -> ‘/backup/system/filename-2022-04-16/hosts’

#需求6:继需求5,判断备份的文件是否存在,如果不存在则提示”No such file or directory“,然后退出
[root@manage if]# cat var13.sh 
#!/bin/bash
read -p "请输入要备份的文件:" file
Date=$(date +%F)
Desc=/backup/system
#1.判断文件是否存在
if [ ! -f $file ];then
    echo "$file No such file or directory"
    exit
fi
[ -d ${Desc} ] || mkdir -p $Desc
cp -rpv $file $Desc/filename-${Date}

[root@manage if]# sh +x var13.sh 
请输入要备份的文件:/etc/qqq
/etc/qqq No such file or directory

#需求7:继需求5、6,判断备份的文件是否为空,如果为空则提示"This is file empty",然后退出
[root@manage if]# cat var13.sh 
#!/bin/bash
read -p "请输入要备份的文件:" file
Date=$(date +%F)
Desc=/backup/system
#1.判断文件是否存在
if [ ! -f $file ];then
    echo "$file No such file or directory"
    exit
fi
#2.判断文件为空,则报错
if [ ! -s $file ];then
    echo "$file This is file empty"
    exit
fi
#3.判断目标目录是否存在,如果不存在则创建
if [ ! -d ${Desc} ];then
       mkdir -p $Desc
fi
cp -rpv $file $Desc/filename-${Date}

[root@manage if]# sh +x var13.sh 
请输入要备份的文件:/etc/qqq
/etc/qqq This is file empty
[root@manage if]# sh +x var13.sh 
请输入要备份的文件:/etc/hosts
‘/etc/hosts’ -> ‘/backup/system/filename-2022-04-16/hosts’
[root@manage if]# sh +x var13.sh 
请输入要备份的文件:/etc/ttt
/etc/ttt No such file or directory

3.3 if基于字符比较

字符串比较

参数 说明 示例 解释
== 等于则条件为真 [ “ a " = = " a" == " a"=="b” ]
!= 不相等则条件为真 [ “ a " ! = " a" != " a"!="b” ]
-z 字符串的长度为0则为真 [ -z “$a” ] 内容空则为真
-n 字符串的长度不为空则为真 [ -n “$a” ] 有内容则为真

1.字符串比对,必须加双引号

[root@manage if]# [ "$USER" = "root" ];echo $?
0
[root@manage if]# [ "$USER" = "tomcat" ];echo $?
1
[root@manage if]# [ "$USER" != "tomcat" ];echo $?
0

[root@manage if]# bbb=""
[root@manage if]# echo ${#bbb}
0

#字符长度为0
[root@manage if]# [ -z "$bbb" ]
[root@manage if]# echo $?
0

#字符长度不为0
[root@manage if]# [ -n "$bbb" ]
[root@manage if]# echo $?
1

#示例:输入不为空的值,打印出来,如果输入空值,提示不能输入空值
[root@manage if]# cat var14.sh 
#!/bin/bash
read -p "请输入一个数字:" num

if [ -z $num ];then
     echo "请不要输入空值...."
else
      echo "你输入的数字是:$num"
fi

[root@manage if]# sh +x var14.sh 
请输入一个数字:  #直接按回车
请不要输入空值....
[root@manage if]# sh +x var14.sh 
请输入一个数字:10
你输入的数字是:10

2.整数多条件比对

[root@manage if]# [ 1 -lt 2 -a 5 -gt 10 ];echo $?
1
[root@manage if]# [ 1 -lt 2 -o 5 -gt 10 ];echo $?
0

[root@manage if]# [ 1 -lt 2 ] && [ 5 -gt 10 ];echo $?
1
[root@manage if]# [ 1 -lt 2 ] || [ 5 -gt 10 ];echo $?
0


#正则比对会使用到[[]](&&且    ||或者)
[root@manage if]# [[ 1 -lt 2 && 5 -gt 10 ]];echo $?
1
[root@manage if]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $?
0

#需求1:提示学生输入自己的成绩。
	1.如果分数大于0小于59提示补考。
	2.如果分数大于60小于70提示良好。
	3.如果分数大于71小于85提示好。
	4.如果分数大于86小于100提示优秀。
	5.不允许输入空值.
	6.必须输入的是全数字.
	
[root@manage if]# cat var15.sh 
#!/bin/bash
# **********************************************************
# * Author        : qqq
# * Email         : [email protected]
# * Create time   : 2022-04-17 10:02
# * Filename      : var15.sh
# * Description   : 
# **********************************************************
read -p "请输入自己的成绩:" cj
if [ -z $cj ];then
      echo "请不要输入空值,谢谢.."
      exit 1
fi
#除了数字0-9以外的,其他都匹配
if [[ ! $cj =~ ^[0-9]+$ ]];then
      echo "请输入纯数字....."
      exit 2
fi
if [ $cj -ge 0 ] && [ $cj -le 59 ];then
        echo "你的成绩为:$cj 准备补考"

elif [ $cj -ge 60 ] && [ $cj -le 70 ];then
        echo "你的成绩为:$cj 成绩及格"

elif [ $cj -ge 71 ] && [ $cj -le 85 ];then
        echo "你的成绩为:$cj 成绩良好"

elif [ $cj -ge 86 ] && [ $cj -le 100 ];then
        echo "你的成绩为:$cj 成绩优秀"

else
        echo "请输入100以内的数字....."
fi

[root@manage if]# sh var15.sh 
请输入自己的成绩:12
你的成绩为:12 准备补考
[root@manage if]# sh var15.sh 
请输入自己的成绩:56
你的成绩为:56 准备补考
[root@manage if]# sh var15.sh 
请输入自己的成绩:67
你的成绩为:67 成绩及格
[root@manage if]# sh var15.sh 
请输入自己的成绩:89
你的成绩为:89 成绩优秀
[root@manage if]# sh var15.sh 
请输入自己的成绩:101
请输入100以内的数字.....
[root@manage if]# sh var15.sh 
请输入自己的成绩:aaa
请输入纯数字.....

正则表达式匹配示例

[root@manage if]# num=1111
[root@manage if]# [[ "$num" =~ ^[0-9]+$ ]];echo $?
0
[root@manage if]# 
[root@manage if]# num=aaa
[root@manage if]# [[ "$num" =~ ^[a-z]+$ ]];echo $?
0
[root@manage if]# num=aaA
[root@manage if]# [[ "$num" =~ ^[a-Z]+$ ]];echo $?
0
[root@manage if]# num=AAA
[root@manage if]# [[ "$num" =~ ^[A-Z]+$ ]];echo $?
0

[root@manage if]# num=AAAaa
[root@manage if]# [[ "$num" =~ ^[A-Z]+$ ]];echo $?
1
[root@manage if]# num=AAA123
[root@manage if]# [[ "$num" =~ ^[A-Z]+$ ]];echo $?
1
[root@manage if]# num=aaa
[root@manage if]# [[ "$num" =~ ^[A-Z]+$ ]];echo $?
1

#需求1:使用for循环打印一推单词,然后仅输出以r开头的单词
[root@manage if]# sh +x var16.sh 
rx
rw
red
[root@manage if]# cat var16.sh 
#!/bin/bash
for var in ab ac rx rw tt red
do
    if [[ "$var" =~ ^r ]];then
           echo $var
fi
done

[root@manage if]# sh +x var16.sh 
rx
rw
red

#需求2:编写一个创建用户的脚本。
	1.提示用户输入要创建用户的前缀,必须是英文。  test
	2.提示用户输入后缀,必须是数字。			  123
	3.如果前缀和后缀都没有问题,则进行用户创建。
	
[root@manage if]# cat var17.sh 
#!/bin/bash
read -p "请输入要创建的用户名前缀:" name

if [[ ! "$name" =~ ^[a-Z]+$ ]];then
      echo "请输入纯字符..."
      exit 1
fi

read -p "请输入要创建的用户名后缀:" num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
      echo "请输入纯数字..."
      exit 2
fi

user_name=$name$num
echo $user_name
id $user_name &>/dev/null
if [ $? -eq 0 ];then
        echo "$user_name用户已存在"
        exit 3
else
     useradd $user_name
     echo "$user_name用户创建成功"
fi

[root@manage if]# sh + var17.sh
请输入要创建的用户名前缀:qqq
请输入要创建的用户名后缀:111
qqq111
qqq111用户创建成功

3.4 if判断练习

#需求1.使用root用户清空/var/log/messages日志,并每次执行保留最近100行
[root@manage if]# cat var18.sh 
#!/bin/bash
Log_path=/var/log/messages
if [ $UID -ne 0 ] ;then
    echo "Permission denied"
    exit 1
fi

if [ -f $Log_path ];then
    #先提取100行的内容写入新的文件
    tail -100 ${Log_path} > ${Log_path}_bak

    #将新的文件重新写入/var/log/messages中
    cat ${Log_path}_bak > ${Log_path}
    #删除备份文件
    rm -f ${Log_path}_bak

    #输出结果
    echo "clean log done....."
else
       echo "$Log_Path No such file or directory"
       exit 2
fi

[root@manage if]# sh -x var18.sh 
+ Log_path=/var/log/messages
+ '[' 0 -ne 0 ']'
+ '[' -f /var/log/messages ']'
+ tail -100 /var/log/messages
+ cat /var/log/messages_bak
+ rm -f /var/log/messages_bak
+ echo 'clean log done.....'
clean log done.....
[root@manage if]# wc -l /var/log/messages
100 /var/log/messages

#需求2:判断httpd服务是否正常启动,  脚本名必须为httpd_deamon.sh   $$
1.手动如何看这个服务是正常的
		1.ps
		2.losf netstat
		3.curl  200 301 302 
		4.systemctl
		
[root@manage if]# cat var19.sh 
#!/bin/bash
systemctl status httpd >/dev/null


if [ $? -eq 0 ];then
    echo "httpd is  ok...."
else
    systemctl start httpd >/dev/null
    if [ $? -eq 0 ];then
         echo "httpd重启ok..."
    else
         echo "httpd重启失败...."
   fi
fi


方式2:
[root@manage if]# cat var19.sh 
#!/bin/bash
Httpd_status=$(ps aux|grep httpd | grep -v grep |wc -l)
if [ $Httpd_status -ge 1 ];then
	echo "httpd service is ok"
else
	systemctl start httpd &>/dev/null
	if [ $? -eq 0 ];then
		echo "重新拉起成功"
	else
		echo "重新拉起失败"
	fi
fi

方式3:
[root@manage if]# cat var19.sh 
#!/bin/bash
Httpd_Status=$(curl -sI  localhost | awk '/HTTP/ {print $2}')


if [[ "$Httpd_Status" -eq 200  ||  "$Httpd_Status" -eq 301  ||  "$Httpd_Status" -eq 302 ]];then
	echo "Httpd is ok ...."
else
	echo "Httpd is down...."
	echo "尝试复活中......."
	sleep 3
	systemctl start httpd &>/dev/null
	if [ $? -eq 0 ];then
		echo "复活成功"
	else
		echo "复活失败"
	fi
fi
#需求3:根据不同的系统版本,配置不同的yum源
	1.获取相同系统,不同的版本
	2.根据不同系统的不同版本实现
		1.判断是centos还是ubuntu
		2.根据判断的条件进入嵌套if
[root@manage if]# cat var20.sh 
#!/bin/bash		
system_status=$(cat /etc/redhat-release  | awk '{print $(NF-1)}')

if [ ${system_status%%.*} -eq 7 ];then
	echo "systemctl 7"
elif [ ${system_status%%.*} -eq 6 ];then
	echo "systemctl 6"
fi
	2.根据不同的系统配置不同yum源
#大致思路,脚本不全

if [ $system == "Centos" ];then
    if [ 如果6 ];then
         echo"执行6的安装"
         elif [ 如果是7 ];then
             echo"执行7的安装"
         else
             echo "无法识别"
    fi
    elif [ $system == "ubuntu" ];then
        if [ 如果6 ];then
         echo"执行6的安装"
         elif [ 如果是7 ];then
             echo"执行7的安装"
         else
             echo "无法识别"
    else
          echo "anway"
          exit
fi
#需求4:安装不同版本的PHP方式,使用echo输出即可,不用真的安装。
	1.给一个选择的菜单
	2.给一个数字编号  1 2 3 4 
	3.根据用户的选择进行判断
	
[root@manage if]# cat var20.sh 
#!/bin/bash
clear
cat <<EOF
=====================================
1) Installed PHP 5.5 
2) Installed PHP 7.0
3) Installed PHP 7.3 
4) quit
=====================================
EOF
read -p "请输入你要安装的版本[ 1 | 2 | 3 | 4 ]: " Action

#判断是否为空值
if [ -z $Action ];then
      echo "请不要输入空值...."
      exit 1
fi

#必须输入数字
if [[ ! $Action =~ ^[0-9]+$ ]];then
      echo "仅支持1位数字"
      exit 2
fi

#判断
if [ $Action -eq 1 ];then
        echo "1)Installed PHP 5.5"

elif [ $Action -eq 2 ];then
        echo "2)Installed PHP 7.0"

elif [ $Action -eq 3 ];then
        echo "3)Installed PHP 7.5"
else
        exit 1
fi

#需求5:写一个脚本,提示用户输入身高,如果身高达到180以上全票,120以下免票,其余不能进。
	1.需要交互
	2.判断  超过180
	3.判断  低于120
	4.其他  over
	
[root@manage if]# cat var21.sh 
#!/bin/bash
read -p "请输入身高:" Action
if [ $Action -ge 180 ];then
     echo "全票....."
else
     if [ $Action -lt 120 ];then
          echo "免费......"
      else
          echo "不让进....."
     fi
fi

#需求6:写一个Nginx安装脚本,加入判断,当上一步执行成功在执行下一步,否则退出脚本

	1.网络
	2.源
	3.安装
	4.判断
	
[root@manage if]# cat var22.sh 
#!/bin/bash
#1网络
ping -W1 -c1 www.baidu.com &>/dev/null
if [ $? -ne 0 ];then
    echo "网络不通....."
    exit 1
fi

#2.源  记得要判断系统
if [ -f /etc/yum.repos.d/epel.repo ];then
   if [ -s /etc/yum.repos.d/epel.repo ];then
           echo "yum repos skip....."
       else
           echo "epel 为空 wget ...."
           #wget
   fi
       else
           echo "epel文件不存在"
           #wget
fi

#3.安装
rpm -q nginx &>/dev/null
rc=$?

if [ $rc -eq 0 ];then
	echo "nginx已安装"
else
	yum install nginx -y 
fi

#需求7:在每月第一天备份并压缩/etc目录的所有内容,存放到/opt/bak目录,存放的形式
[root@manage if]# cat var23.sh 
#!/bin/bash
Date=$(date +%F)
Desc_dir=/opt/bak

#准备存放的目录
if [ ! -d $Desc_dir ];then
     mkdir -p $Desc_dir
fi

#打包并放到对应的目录
cd / && tar czf $Desc_dir/${Date}_etc.tar.gz etc

if [ ! $? -eq 0 ];then
     echo "备份失败....."
fi

[root@manage if]# sh -x var23.sh 
++ date +%F
+ Date=2022-04-17
+ Desc_dir=/opt/bak
+ '[' '!' -d /opt/bak ']'
+ mkdir -p /opt/bak
+ cd /
+ tar czf /opt/bak/2022-04-17_etc.tar.gz etc
+ '[' '!' 0 -eq 0 ']'
[root@manage if]# ll /opt/bak/2022-04-17_etc.tar.gz 
-rw-r--r-- 1 root root 11229837 Apr 17 15:12 /opt/bak/2022-04-17_etc.tar.gz
#需求8:监控内存小于500M和磁盘容量小于10G,则发邮件报警
	1.剩余内存低于500M    free -m |awk '/^Mem/ {print $NF}'
	2.剩余磁盘低于10G	  df -h|awk '/\/$/ {print $(NF-2)}'
	
[root@manage if]# cat var24.sh 
#!/bin/bash
Free=$(free -m |awk '/^Mem/ {print $NF}')
Disk=$(df -h|awk '/\/$/ {print $(NF-2)}')

if [ $Free -lt 500 -a ${Disk%G} -lt 10 ];then
           echo "报警"
else
           echo "内存是:$Free M,磁盘是:$Disk"
fi

[root@manage if]# sh +x var24.sh 
内存是:1395 M,磁盘是:26G

#需求9:检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员
[root@manage if]# cat var25.sh 
#!/bin/bash
if [ $UID -eq 0 ];then
        yum install vsftpd -y >/dev/null
else
        echo "你不是管理员...."
        exit
fi

#需求10:输入三个数并进行升序排序
[root@manage if]# cat var26.sh 
#!/bin/bash
if [ ! $# -eq 3 ];then
     echo "请输入3个参数"
     exit 1
fi
echo "$1 $2 $3 "|xargs -n1 | sort -n

[root@manage if]# sh var26.sh 1 29 7
1
7
29
[root@manage if]# sh var26.sh d h q
d
h
q

#需求11:根据用户输入密码位数,生产随机密码(包含数字、大小写字母、特殊符号)
1.怎么生成随机数   mkpasswd -l 8
2.控制输入的长度,最少8位
[root@manage if]# cat var27.sh 
#!/bin/bash
read -p "请输入你想生成的随机数密码位数:" Action

#控制回车
if [ -z $Action ];then
      echo "请不要输入回车"
      exit 1
fi

#控制必须是数字
if [[ ! $Action =~ ^[0-9]+$ ]];then
         echo "请输入数字"
         exit 2
fi

if [[ $Action -ge 7 && $Action -lt 20 ]];then
     mkpasswd -l $Action
else
      echo "密码复杂度必须7位以上20位以下"   
fi

[root@manage if]# sh var27.sh
请输入你想生成的随机数密码位数:
请不要输入回车
[root@manage if]# sh var27.sh
请输入你想生成的随机数密码位数:10
nZqm3ge0B*
[root@manage if]# sh var27.sh
请输入你想生成的随机数密码位数:111
密码复杂度必须7位以上20位以下


#需求12:提示用户输入年份后判断该年是否为闰年  能整除4, 并且不能被100整除则为 闰年
	2012 / 4  = 整数  -a    2012 / 100 = 有余数     
	
	1.传递年份   2012 2013 
	2.用年份除以4
		2.1 在用年份除以100
			如果有余数  则是润年
			如果没有    则是平年
			
#方式1:
[root@manage if]# cat var28.sh 
#!/bin/bash
read -p "请输入你想要检测的年份:" Action
#1.先除以4
rn=$(( ${Action} % 4 ))
rn_2=$(( ${Action} % 100 ))
rn_3=$(( ${Action} % 400 ))

#1.判断是否能被400整除
if [ $rn_3 -eq 0 ];then
     echo "$Action为闰年"
     exit
else
        #2.没有被400整除的,先除以4
	if [ $rn -eq 0 ];then
             #3.成立,在除以100,有余数则为闰年
            if [ $rn_2 -ne 0 ];then
                echo "$Action为闰年"
                exit
            fi
        fi
fi
         echo "$Action为平年"
         
[root@manage if]# sh var28.sh
请输入你想要检测的年份:2004
2004为闰年
[root@manage if]# sh var28.sh
请输入你想要检测的年份:2005
2005为平年

#方式2:
[root@manage if]# cat var29.sh 
#!/bin/bash
read -p "请输入年份:" Y
if [ $[$Y%4] -eq 0 -a $[$Y%100] -ne 0 ] || [ $[$Y%400] -eq 0 ];then
      echo "$Y是闰年"
else
      echo "$Y是平年"
fi

[root@manage if]# sh var29.sh 
请输入年份:2004
2004是闰年
[root@manage if]# sh var29.sh
请输入年份:2005
2005是平年
[root@manage if]# sh var29.sh
请输入年份:2006
2006是平年

你可能感兴趣的:(Shell脚本,linux)