目录
前言
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
- vim if4.sh
- #!/bin/bash
- if [ -e /etc/passwd ];then
- echo"/etc/passwd存在"
- else
- echo"/etc/passwd不存在"
- 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