shell脚本if流程控制详解

简介: Shell条件测试 if 流程控制文件测试数值比较字符串比较1、shell条件测试

Shell条件测试 if 流程控制

文件测试


数值比较


字符串比较


1、shell条件测试

格式1:test 条件表达式


格式2:[ 条件表达式 ]


格式3:[[ 条件表达式 ]]


if后面可用跟任何命令


如果想让条件为真后什么也不输出,则使用:命令,:命令=true命令


1.1文件测试

格式:[ 操作符 文件或目录 ]


选项:


[ -e dir|file ] 测试目录|文件是否存在


[ -d dir ] 测试是否为目录


[ -f file ] 测试是否为文件


[ -r file ] 测试文件是否可读—当前用户


[ -x file ] 测试文件是否可执行—当前用户


[ -w file ] 测试文件是否可写—当前用户


[ -L file ] 测试文件是否为链接文件

#-------------模拟mysql备份------------
back_dir=/back/`date +%Y%m%d`
if [ ! -d $back_dir ];then
        mkdir -p $back_dir
fi
echo "开始备份..."

1.2整数比较

格式:[ 整数1 操作符 整数2 ]


选项:


[ 1 -gt 10 ] 大于


[ 1 -lt 10 ] 小于


[ 1 -eq 10 ] 等于


[ 1 -ne 10 ] 不等于


[ 1 -ge 10 ] 大于等于


[ 1 -le 10 ] 小于等于


1.2.1创建用户

read -p "please input username: " user
if id $user &>/dev/null;then
        echo "user $user already exists"
        exit
else
        useradd $user
        if [ $? -eq 0 ];then
                echo "user is created..."
                echo "123"|passwd --stdin $user &>/dev/null
                if [ $? -eq 0 ];then
                        echo "Initialize the password for '123'"
                fi
        fi
fi

1.2.2磁盘空间告警

#!/bin/bash
=======================第一种=========================
disk_used=$(df -hT|grep '/$'|awk '{print $(NF-1)}'|awk -F "%" '{print $1}')
mail_user=jiangxiaolong
if [ $disk_used -ge 9 ];then
        echo "`date +%Y-%m-%d-%X` disk / used is : ${disk_used}%" | mail -s "disk waring..." $mail_user
fi
=======================第二种=========================
disk_gen_used=$(df  | grep '/$' | awk '{print $3}')
disk_gen_total=$(df | grep '/$' | awk '{print $2}')
disk_gen_percent=$(($disk_gen_used*100/$disk_gen_total))
disk_myscr_used=$(df | grep '/my_scripts' | awk '{print $3}')
disk_myscr_total=$(df | grep '/my_scripts' | awk '{print $2}')
disk_myscr_percent=$(($disk_myscr_used*100/$disk_myscr_total))
#disk_gen_content=`cat /tmp/disk_war.txt | grep -v "my_scripts"`
#disk_myscr_content=`cat /tmp/disk_war.txt | grep "my_scripts"`
gen_file=/tmp/disk_gen_war.txt
myscr_file=/tmp/disk_myscr_war.txt
rm -rf $genfile $myscr_file
if [ $disk_gen_percent -ge 90 ];then
        echo "$(date +%F-%X) disk / is used: ${disk_gen_percent}%" > $gen_file
        if [ -f $gen_file ];then
                mail -s "disk / war.." jiangxiaolong  < $gen_file
        fi
        rm -rf $gen_file
fi
if [ $disk_myscr_percent -ge 90 ];then
        echo "$(date +%F-%X) disk /my_scripts is used: ${disk_myscr_percent}%" > $myscr_file
        if [ -f $myscr_file ];then
                mail -s "disk /my_scripts war..." jiangxiaolong < $myscr_file
        fi
        rm -rf $myscr_file
fi

1.2.3内存空间告警

#!/bin/bash
mem_used=$(free -m | grep '^Mem' |awk '{print $(NF-4)}')
mem_total=$(free -m | grep '^Mem' |awk '{print $(NF-5)}')
mem_percent=$(($mem_used*100/$mem_total))
mem_gj_file=/tmp/memory.txt
rm -rf $mem_gj_file
if [ $mem_percent -ge 80 ];then
        echo "$(date +%F) memory is used: $mem_percent " > $mem_gj_file
fi
if [ -f $mem_gj_file ];then
        mail -s "memory war..." jiangxiaolong < $mem_gj_file
        rm -rf $mem_gj_file
fi

1.3c语言风格的数值比较

((1<2));echo $?     小于
((1==2));echo $?    等于
((1>2));echo $?     大于
((1>=2));echo $?    大于等于
((1<=2));echo $?    小于等于
((1!=2));echo $?    不等于
((`id -u`)>0);echo $? 大于
(($UID==0));echo $?   等于

1.4字符串比较

建议变量名和变量值都使用双引号,否则当变量不存在时会报语法错误

变量为空或未定义,长度都为0

[ "$USER" = "root" ];echo $?
[ "$USER" == "root" ];echo $?
BBB=""
echo ${#BBB}
  0
[ -z "$BBB" ] -z用来测试字符长度是否为0
[ -n "$BBB" ] -n用来测试字符长度是否不为0

下面脚本中的一些解释


[[ ! "n u m " =   [ 0 − 9 ] + num" =~ ^[0-9]+num"=  

[

0−9]+ ]] 双方括号用来测试正则表达式,这是表达式表示只能以0-9开头结尾的数字可以有多个,^:开头 ,$:结尾 ,+可以有多个


[[ "c o n f i r m " =   [ y ∣ Y ] confirm" =~ ^[y|Y]confirm"=  

[

y∣Y] ]] [[ "c o n f i m " =   [ c r e a t e ] confim" =~ ^[create]confim"=  

[

create] ]] [[ "c o n f i m " =   [ d e l e t e ] confim" =~ ^[delete]confim"=  

[

delete] ]]


上述三个例子是字符判断也是正则表达式,这里采用正则是为了练习,更严谨的发放是使用字符判断,例如


[ “$confim” =“create” ]


包含其中1个字符的情况下建议使用正则,多个字符同时满足则建议使用字符串比较


如果函数较长可以写到单独的文件中,然后用source命令加载即可


2.if流程控制

2.1单分支if语句结构

if 命令序列


then


fi


2.1.按套路出牌的批量创建用户

#!/bin/bash
read -p "please input number: " num
read -p "please input prefix: " prefix
for i in `seq 1 $num`
do
        user=$prefix$i
        useradd -M $user
        echo "123"|passwd --stdin $user &>/dev/null
        if [ $? -eq 0 ];then
                echo  "$user is created..."
        fi
done
--------------------------附赠:既然可以创建那么就可以删除-------------------
read -p "please input number: " num
read -p "please input prefix: " prefix
for i in `seq 1 $num`
do
        user=$prefix$i
        if [ -e /home/$user ];then
                userdel -r $user
        else
                userdel $user
        fi
        if [ $? -eq 0 ];then
                echo  "$user is delete..."
        fi
done

2.1.2不按套路出牌创建用户

#!/bin/bash
-------------------创建的------------------
read -p "please input prefix: " prefix
if [ -z "$prefix" ];then
        echo "error prefix"
        exit
fi
read -p "please input number: " num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
        echo "error num"
        exit
fi
read -p "Confirm to create user {prefix+num} [y/n|Y/N]:" confirm
if [[ "$confirm" =~ ^[y|Y]$ ]];then
        echo "create user begin...."
elif [[ "$confirm" =~ ^[n|N]$ ]];then
        echo "keep create user..."
else
        echo "bye..."
fi
for i in `seq $num`
do
        user=$prefix$i
        useradd -M $user
        echo "123"|passwd --stdin $user &>/dev/null
        if [ $? -eq 0 ];then
                echo  "$user is created..."
        fi
done
-----------------------删除的-----------------
read -p "please input prefix: " prefix
if [ -z "$prefix" ];then
        echo "error prefix"
fi
read -p "please input number: " num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
        echo "error num"
fi
read -p "Confirm to delete user {prefix+num} [y/n|Y/N]:" confirm
if [[ "$confirm" =~ ^[y|Y]$ ]];then
        echo "delete user begin...."
elif [[ "$confirm" =~ ^[n|N]$ ]];then
        echo "keep delete user..."
else
        echo "bye..."
fi
for i in `seq  $num`
do
        user=$prefix$i
        if [ -e /home/$user ];then
                userdel -r $user
        else
                userdel $user
        fi
        if [ $? -eq 0 ];then
                echo  "$user is delete..."
        fi
done

2.1.3按套路出牌升级版

加了函数,让用户选择是要创建用户还是删除用户

#!/bin/bash
#-----------------批量创建用户,常规模式------------
#先将创建和删除的命令分别做成函数,在根据输入内容判断执行那个函数
usadd(){
read -p "please input prefix: " prefix
read -p "please input number: " num
for i in `seq 1 $num`
do
  user=$prefix$i
  useradd -M $user
  echo "123"|passwd --stdin $user &>/dev/null
  if [ $? -eq 0 ];then
    echo  "$user is created..."
  fi
done
}
#--------------删用户
usdel(){
read -p "please input prefix: " prefix
read -p "please input number: " num
for i in `seq 1 $num`
do
  user=$prefix$i
  if [ -e /home/$user ];then
    userdel -r $user
  else
    userdel $user
  fi
  if [ $? -eq 0 ];then
    echo  "$user is delete..."
  fi
done
}
read -p "create or delete [create|delete]: " confirm
if [ "$confirm" = "create" ];then
  usadd
elif [ "$confirm" = "delete" ];then
  usdel
else
  echo "bye!!!!!"
fi

2.1.4不按套路出牌升级版

加了函数自由选择

#!/bin/bash
################################################################
#          不按常规走,输入的不是合法的数字|前缀就退出         #
# -----------------批量创建用户,常规模式------------    #
#    根据用户输入的num和prefix,用户确认后将创建对应的用户     #                   #
################################################################
usadd(){
read -p "please input prefix: " prefix
if [ -z "$prefix" ];then
  echo "error prefix"
  exit
fi
read -p "please input number: " num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
  echo "error num"
  exit
fi
read -p "Confirm to create user {prefix+num} [y/n|Y/N]:" confirm
if [[ "$confirm" =~ ^[y|Y]$ ]];then
  echo "create user begin...."
elif [[ "$confirm" =~ ^[n|N]$ ]];then
  echo "keep create user..."
else
  echo "bye..."
fi
for i in `seq $num`
do
  user=$prefix$i
  useradd -M $user
  echo "123"|passwd --stdin $user &>/dev/null
  if [ $? -eq 0 ];then
    echo  "$user is created..."
  fi
done
exit
}
################################################################
#                                    #
# --------------删用户-----------------------               #
#    根据用户输入的num和prefix,用户确认后将删除对应的用户            #                  
################################################################
usdel(){
read -p "please input prefix: " prefix
if [ -z "$prefix" ];then
  echo "error prefix"
fi
read -p "please input number: " num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
  echo "error num"
fi
read -p "Confirm to delete user {prefix+num} [y/n|Y/N]:" confirm
if [[ "$confirm" =~ ^[y|Y]$ ]];then
  echo "delete user begin...."
elif [[ "$confirm" =~ ^[n|N]$ ]];then
  echo "keep delete user..."
else
  echo "bye..."
fi
for i in `seq  $num`
do
  user=$prefix$i
  if [ -e /home/$user ];then
    userdel -r $user
  else
    userdel $user
  fi
  if [ $? -eq 0 ];then
    echo  "$user is delete..."
  fi
done
exit
}
read -p "create or delete [create|delete]: " confirm
if [ "$confirm" = "create" ];then
  usadd
elif [ "$confirm" = "delete" ];then
  usdel
else
  echo "bye!!!!!"
fi

2.2.if双分支语句结构

if 命令序列;then


else


fi


2.3if多分支语句结构

if 条件测试1


then 命令序列


elif 条件测试2


then 命令序列


elif 条件测试3


then 命令序列


else 命令序列


fi


2.3.1安装httpd

#!/bin/bash
www=www.baidu.com
ping -c1 $www &>/dev/null
if [ $? -eq 0 ];then
        echo "check soft..."
        yum list installed | grep http &>/dev/null
        if [ ! $? -eq 0 ];then
                echo "begin install httpd..."
                yum -y install httpd
        else
                echo "httpd is installed..."
        fi
        systemctl restart httpd
        systemctl enable httpd
        firewall-cmd --permanent --add-service=http
        firewall-cmd --permanent --add-service=https
        firewall-cmd --reload
elif ping -c 192.168.81.1 &>/dev/null;then
        echo "check dns..."
else
        echo "check ipaddress..."
fi
systemctl status httpd &>/dev/null
if [ $? -eq 0 ];then
        http_port=$(netstat -lnpt | grep http  | awk '{print $4}' |awk -F':' '{print $4}')
        http_address=$(netstat -lnpt | grep http | awk '{print $4}' |awk -F'80' '{print $1}')
        http_pid=$(netstat -lnpt | grep http | awk '{print $(NF)}' | awk -F"/" '{print $1}')
        echo "http is up..."
        echo "http port is: $http_port"
        echo "http listen address is: $http_address"
        echo "http pid is: $http_pid"
fi

2.3.2配置yum源文件

#!/bin/bash
os_version=$(cat /etc/redhat-release | awk '{print $(NF-1)}'|awk -F"." '{print $1"."$2}')
[ ! -e /etc/yum.repos.d/bak/$(date +%F-X) ] || mkdir -p /etc/yum.repos.d/bak/$(date +%F-X)
mv /etc/yum.repos.d/* /etc/yum.repos.d/bak &>/dev/null
if [ $os_version = "7.6" ];then
        cat >/etc/yum.repos.d/centos7u6.repo <<-EOF
        [centos7u6]
        name=centos7u6
        baseurl=file:///media
        enabled=1
        gpgcheck=0
        EOF
        echo "centos $os_version yumconfig finish..."
elif [ $os_version = "6.5" ];then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
elif [ $os_version = "5.4" ];then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
else
        echo "error osversion"
fi
目录
相关文章
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
77 1
|
21天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
45 2
6种方法打造出色的Shell脚本
|
8天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
29 1
|
12天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
34 2
|
26天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
45 6
|
23天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Java Shell 网络安全
Shell 流程控制
10月更文挑战第4天
35 2
|
1月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
27 0
|
6月前
|
Shell Windows Perl
Shell编程中的条件判断与流程控制
Shell编程中的条件判断与流程控制
89 0
|
Shell
Shell编程:流程控制与高级应用的深入解析
Shell 流程控制 使用Shell编程时,流程控制是非常重要的,它允许你根据条件执行不同的命令或者控制程序的执行流程。Shell支持一些基本的流程控制结构,包括条件语句和循环语句。 1、条件语句 if语句 if [ 条件 ]; then # 如果条件为真执行的命令 elif [ 其他条件 ]; then # 如果其他条件为真执行的命令 else # 如果所有条件都不为真执行的命令 fi 示例: #!/bin/bash read -p "请输入一个数字: " num if [ $num -eq 0 ]; then echo "输入的数字是零" elif [ $n
93 1