shell&流程控制语句if

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: shell 流程控制语句if

目录

编辑

前言

单分支语句

双分支语句

多分支语句

扩展

文件比较

整数比对

变量说明

字符对比

正则比对


前言

if语句是指编程语言(包括c语言、C++、C#、java、VB、汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。if的返回值为真或假,可以用bool型变量进行存储,占用一字节

分支语句

if [ 满足条件 ];then

执行代码

fi

例:

vim if1.sh
#!/bin/bash
if [ while 66>0 ];then
echo "ok"
fi

双分支语句

if [ 满足条件 ];then

执行代码

else

执行另一条代码

fi

例:查找/etc/passwd文件下有无该用户

vim if2.sh
#!/bin/bash
if grep "$1" /etc/passwd;then
echo "ok"
else
echo "error"
fi 
sh if2.sh root
sh if2.sh wangwu

if语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式。其中最直观、最容易理解的是关系表达式。所谓关系表达式就是两个数值进行比较的式子。

多分支语句

逐条匹配,匹配即执行

if [ 满足条件1 ];then

执行代码1

elif [ 满足条件2 ];then

执行代码2

else

执行最后代码

fi

例:

vim if3.sh
#!/bin/bash
read -p "请输入用户名:"  User
if grep $User /etc/passwd &> /dev/null;then
echo "用户$User存在"
elif ls -d /home/$User &> /dev/null;then
echo "用户$User不存在"
echo "但是$User宿主目录存在"
else 
echo "用户$User不存在"
echo "$User宿主目录也不存在"
fi

扩展

>  正确输出  >> 追加输出重定向

2> 错误输出  2>> 错误追加输出重定向

&> 混合输出  &>> 混合追加输出



      当使用">" 符号时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。当使用">" 符号时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。

      当使用 “>>” 符号进行追加时,则不会删除原来已经存在的文件。当使用 “>>” 符号进行追加时,则不会删除原来已经存在的文件。

文件比较

-e 文件或目录是否存在 [ -e file ]

-s  文件存在且至少有一个字符则为真 [ -s file ]

-d 目录是否存在 [ -d file ]

-f  文件是否存在 [ -f file ]

-r  文件存在且可读 [ -r file ]

-w  文件存在且可写 [ -w file ]

-x  文件存在且可执行  [ -x file ]


例:判断 /etc/passwd 文件是否存在

vim if4.sh
#!/bin/bash
if [ -e /etc/passwd ];then
echo "/etc/passwd存在"
else
echo "/etc/passwd不存在"
fi
  1. vim if4.sh
  2. #!/bin/bash
  3. if [ -e /etc/passwd ];then
  4. echo"/etc/passwd存在"
  5. else
  6. echo"/etc/passwd不存在"
  7. fi
vim mysql_backup.sh 
#!/bin/bash
Backupdir="/backup/mysql" 
[ -d $Backupdir ]||mkdir -p $Backupdir
read -p "请输入你要备份的库名:" DB  
mysqldump -uroot -p123 --single-transaction -R -B $DB > $Backupdir/${DB}_$(date +%F).sql
if [ $? -eq 0 ];then
echo "--------$DB数据库备份成功----------"
fi

整数比对

-eq 等于则为真 [ $? -eq 0 ]

-ne 不等则为真 [ $? -ne 0 ]

-gt 大于则为真 [ 1 -gt 2 ]

-lt 小于则为真 [ 1 -lt 2 ]

-ge 大于等于则为真 [ 1 -ge 2 ]

-le 小于等于则为真 [ 1 -le 2 ]


变量说明


$$         Shell本身的PID(ProcessID)

$!          Shell最后运行的后台Process的PID

$?         最后运行的命令的结束代码(返回值)

$-          使用Set命令设定的Flag一览

$*          所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$@        所有参数列表。

$#          添加到Shell的参数个数

$0         Shell本身的文件名

$1~$n        添加到Shell的各参数值。$1是第1参数、$2是第2参数…。


例:判断服务是否运行


vim service.sh 
#!/bin/bash
if [ $# -ne 1 ];then
echo "请输入一个服务名称: sh $0 sshd|httpd|mysqld|nginx"
exit
fi
systemctl status "$1" &> /dev/nul l
if [ $? -eq 0 ];then
echo "$1 服务正在运行"
else
echo "$1 服务没有运行"
systemctl restart $1
echo "$1 服务已重新启动"
fi 

字符对比

= 等于则为真 [ "$a" == "$b" ]

!= 不等则为真 [ ! "$b" == "$a" ]         [  "$b" != "$a"  ]

-z 字符长度为零则为真 [ -z "$a" ]

-n  字符长度不为零则为真 [ -n "$a" ]

str1>str2 str1大于str2则为真 [ str1>str2 ]

str1<str2 str1小于str2则为真 [ str1<str2 ]


例1:

vim if5.sh 
#!/bin/bash
read -p "请选择,yes|no" yn
if [ $yn == "yes" ];then
echo "this is ok"
fi 

例2:多整数对比

与&& = -a  and

或|| = -o   or

[ 1 -lt 2 -a 3 -gt 4 ];echo $?
[ 1 -lt 2 -o 3 -gt 4 ];echo $?
[ 1 -lt 2 ] && [ 3 -gt 4 ];echo $?
[ 1 -lt 2 ] || [ 3 -gt 4 ];echo $?

根据学生成绩,判断评价

80-100 优秀

60-80 合格

0-60 不合格

vim if6.sh
#!/bin/bash 
read -p "请输入你的分数:"  FS
expr $FS + 1 &> /dev/null
if [ $? -ne 0 ];then
echo "请输入数字"
exit
fi
if [ $FS -ge 0 -a $FS -lt 60 ];then
echo "不合格,补考"
elif [ $FS -ge 60 -a $FS -lt 80 ];then
echo "合格,加油"
elif [ $FS -ge 80 -a $FS -le 100 ];then
echo "优秀,恭喜"
else
echo "请输入[0-100]"
fi 

正则比对

使用[[]]

判断当前用户是否r开头

[[ "$USER" =~ ^r ]];echo $?

判断变量是不是全数字

Num=123456
[[ "$Num" =~ ^[0-9]+$ ]];echo $?
Num=123456a
[[ "$Num" =~ ^[0-9]+$ ]];echo $?
#!/bin/bash
read -p "请输入一个数值:" Num
 if [[ "$Num" =~ ^[0-9]+$ ]];then
echo "你输入的全是数字"
else
echo "你输入的不全是数字"
fi 
echo "你输入的数值是:$Num"
vim if8.sh
#!/bin/bash 
read -p "请输入用户名前缀:a-z或A-Z: " QZ
if [[ ! $QZ =~ ^[a-Z]+$ ]];then
        echo "你输入的不是全字母"
        exit
fi
read -p "请输入用户名后缀:0-9: " HZ
if [[  $HZ =~ ^[0-9]+$ ]];then
        useradd ${QZ}${HZ}
echo "123456" | passwd --stdin ${qz}${hz}
        echo "你的用户${qz}${hz}已经创建成功"
        echo "你的用户初始密码为“123456”"
fi

创建多个用户脚本(验证用户名和创建用户的个数)

read -p "请选择您的操作1.创建用户 2.删除用户:" sel
#判断如果选择添加
if [ $sel -eq 1 ];then
read -p "请输入用名:" username
if [[ $username =~ ^[0-9]+$ ]]; then
        echo "用户名不能为数字"
        exit
fi
read -p "请输入创建用户的个数:" count
if [[ $count =~ ^[^0-9]+$ ]]; then
        echo "个数必须为数字"
        exit
fi
for i in `seq $count`
do
        useradd $username${i} &> /dev/null
        echo "123456" |passwd --stdin $username${i} &> /dev/null
        echo "用户创建成功!"
done
#如果选择删除
elif [ $sel -eq 2 ];then
read -p "请输入用名:" username
if [[ $username =~ ^[0-9]+$ ]]; then
        echo "用户名不能为数字"
        exit
fi
read -p "请输入删除用户的个数:" count
if [[ $count =~ ^[^0-9]+$ ]]; then
        echo "个数必须为数字"
        exit
fi
for i in `seq $count`
do
        userdel -r $username${i} &> /dev/null
done
        echo "$username 删除成功!"
else
        echo "您的输入有误,程序退出!"
        exit
fi

使用root清空/var/log/messages,但保留最近100行

思路:

判断用户是root

判断文件是否存在

清空保留最近100行

vim log.sh 
#!/bin/bash 
if [ $UID -eq 0 ] && [ $USER == "root" ];then 
if [ -f /var/log/messages ];then
cp /var/log/messages /var/log/messages_$(date +%F).bak
        tail -100 /var/log/messages_$(date +%F).bak > /var/log/messages
echo "------成功-------"
else 
echo "文件/var/log/messages不存在"
fi
else 
echo "$USER 没有此权限"
exit
f

根据不同的系统安装不同的yum源

思路:

提取当前系统版本

配置相应版本的yum源

vim sysyum.sh 
#!/bin/bash
sys=$(cat /etc/redhat-release  |awk '{print $4}')
if [ ${sys%%.*} -eq 6 ];then
        mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
        wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
        echo "centos6的yum源已经配置完成"
elif [ ${sys%%.*} -eq 7 ];then
        mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
        wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
        echo "centos7的yum源已经配置完成"
else
        mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak        wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
        echo "centos8的yum源已经配置完成"
fi

安装不同版本的PHP

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

vim php.sh
#!/bin/bash
cat <<EOF
1.Install php 5.5
2.Install php 5.6
3.Install php 7.2
4.Exit
EOF
read -p "请输入你要安装的PHP版本:1|2|3|4" In
if [ $In -eq 1 ];then
sleep 2
yum -y install php55w* 
echo "Install php5.5 Done......"
elif [ $In -eq 2 ];then
sleep 2
 yum install php56w* 
echo "Install php5.6 Done......"
elif [ $In -eq 3 ];then
sleep 2
 yum install php72w* 
echo "Install php7.2 Done......"
else
exit
fi 




相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
Shell
在Shell脚本中的if语句
在Shell脚本中的if语句
73 1
|
11月前
|
Shell 分布式数据库
shell脚本中if判断‘-a‘ - ‘-z‘含义
shell脚本中if判断‘-a‘ - ‘-z‘含义
|
12天前
|
Ubuntu Shell Linux
Shell 流程控制语句
Shell 流程控制语句
16 6
|
3月前
|
Shell
Shell脚本之条件语句if总结
Shell脚本之条件语句if总结
|
3月前
|
Shell Linux BI
linux shell脚本中 if 条件判断
linux shell脚本中 if 条件判断
25 0
|
4月前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句
|
4月前
|
Shell
shell 学习(四)【if语法 for循环控制】
shell 学习(四)【if语法 for循环控制】
33 0
|
4月前
|
Shell
在Shell脚本中,使用`if`语句进行复杂的条件判断
在Shell脚本中,使用`if`语句进行复杂的条件判断
104 2
|
4月前
|
存储 Shell
Shell编程自动化之if、for、while和函数
本文主要介绍了Shell编程自动化之if、for、while和函数,并结合实例测试。
61 3
|
运维 Shell 应用服务中间件
【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)
【运维知识高级篇】超详细的Shell编程讲解3(if判断+Shell菜单+case流程判断+批量创建删除用户+猜数字小游戏)
157 1