shell&流程控制语句if

目录

​编辑

前言

 单分支语句

 双分支语句

多分支语句

扩展

文件比较 

整数比对

变量说明

字符对比

正则比对


shell&流程控制语句if_第1张图片

前言

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

例2:备份mysql,手动输入备份的库名,单库备份

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

例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
fi

根据不同的系统安装不同的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 <

你可能感兴趣的:(liunx基础学习,运维,linux,ssh,学习)