linux中的if、for、while、case具体用法

文章详细展示了如何在Linuxshell脚本中使用if语句进行条件判断,包括单分支、双分支和多分支逻辑,以及如何结合其他命令如ping、id、mkdir等进行服务状态检查、用户管理、目录存在性检测等操作。同时,文中还提到了for和while循环的使用,以及case语句在服务控制脚本中的应用。
摘要由CSDN通过智能技术生成

1.if语句 
if    如果
then    那么


单分支举例
检测目录cdrom是否存在,若不存在则创建
# vim a.sh  
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ -z $MOUNT_DIR ]
then
        mkdir -p $MOUNT_DIR
        echo "目录'${MOUNT_DIR}'已创建成功!"
fi


# vim fdisk.sh
#!/bin/bash
if [ $USER != root ]
then
        echo "当前用户为${USER},该用户不是超级管理员,无法执行该命令!"
        exit 1
#//当命令执行到此处时,将不再执行接下来的命令。如,将该值删除后,无论用户是不是root都将会执行fi之后的命令
fi
echo -e "\e[5;32m 该系统磁盘情况如下:\e[0m"
fdisk -l

双分支举例
else    否则
检测ping的对象是否能够连通,并反馈结果
# vim b.sh
#!/bin/bash
ping -c 1 -i 0.2 -W 3 $1 &> /dev/null
#        -c包的个数,i测试时间间隔 W延迟3秒等待应答
if [ $? -eq 0 ]
then
        echo "Host $1 is up!"
else
        echo "Host $1 is down!"
fi

# bash b.sh 192.168.1.151
Host 192.168.1.151 is up!


#!/bin/bash
ping -c 4 $1 &> /dev/null
if [ $? -eq 0 ];then
        echo "主机$1连接成功!"
else    
        echo "主机$1无法连接!"
fi

#!/bin/bash
Name=user1
if id $Name &> /dev/null;then
        echo "user1存在,ID信息为:`id $Name`"
else
        echo "user1不存在,正在建立该用户..."
        useradd $Name
        echo 123456 | passwd --stdin $Name &> /dev/null
fi

给一个用户,判断该用户是管理员还是普通用户:
#!/bin/bash
A=`id -u $1`
if [ $A -eq 0 ] &> /dev/null;then
        echo "当前用户$1 的UID为:$A,为系统管理员!"
else
        echo "当前用户$1 的UID为:$A,为普通用户!"
fi

升级:
#!/bin/bash
id $1 &>/dev/null
if [ $? -eq 0 ];then
A=`id -u $1`
        if [ $A -eq 0 ];then
                echo "当前用户$1 的UID为:$A,为系统管理员!"
        else
                echo "当前用户$1 的UID为:$A,为普通用户!"
        fi
else
        echo "你输入的用户名不存在!"
fi

查询httpd服务是否启动,没启动则启动。
#!/bin/bash
HTTPD=`netstat -anpt | grep httpd | awk -F: '{print $4}'`
STATUS=`pidof httpd`
#START=`apachectl start`
if [ -z $HTTPD ];then
        echo "当前程序未启动,正在启动..."
        apachectl start &> /dev/null &&echo -e "\e[5;32m 服务已启动! \e[0m"
else
        echo -e "当前查询的服务状态为:\e[5;32m已启动! \e[0m\n相关进程ID号为:\n\e[1;36m $STATUS \e[0m"
fi


检测vsftpd服务是否运行,如果已经运行则列出监听地址、PID,否则提示不可用
#!/bin/bash
systemctl status vsftpd &> /dev/null
if [ $? -eq 0 ]
then
        echo "监听地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"
        echo "进程PID号:$(pgrep vsftpd)"
else
        echo "警告:vsftpd服务不可用!"
fi


查询用户输入的服务是否启动,没启动则启动
#!/bin/bash
SERVERS=`netstat -anpt | grep $1`
SPID=`pgrep $1`
if [ -z "$SERVERS" ]
then
        echo "当前程序未启动"
        echo "正在启动该程序..."
        systemctl start $1 &> /dev/null
    SPID=`pgrep $1`
    echo "当前程序已运行成功,PID为:$SPID"
else
        echo "当前程序已运行,PID为:$SPID"
fi

# netstat -anpt  | grep "10:22" | awk '{print $4}' | cut -d':' -f 1        //只截取sshd的监听ip地址
192.168.1.10


多分支举例

# vim d.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
    echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
    echo "$GRADE 分,合格"
else
    echo "$GRADE 分?不合格"
fi


#!/bin/bash
read -p "请输入数字,0-5范围内:" A
if [ $A -eq 0 ]
then
        echo "你输入的数字是$A!"
elif [ $A -eq 1 ]
then
        echo "你输入的数字是$A!"
elif [ $A -eq 2 ]
then
        echo "你输入的数字是$A!"
elif [ $A -eq 3 ]
then
        echo "你输入的数字是$A!"
elif [ $A -eq 4 ]
then
        echo "你输入的数字是$A!"
elif [ $A -eq 5 ]
then
        echo "你输入的数字是$A!"                                      
else
        echo "你输入的数字不在规定范围内!"                            
fi


#!/bin/bash
read -p "请输入你要查询的分数(0-100):" A  90
if [ $A -ge 80 ]
then
        echo "你的成绩为${A}分,很不错,你很优秀!"
elif [ $A -ge 60 ] && [ $A -lt 80 ]
then
        echo "你的成绩为${A}分,你的成绩及格,请继续努力!"
elif [ $A -ge 40 ] && [ $A -lt 60 ]
then
        echo "你的成绩为${A}分,你的成绩未及格,再稍微努力你就合格了!"
else
        echo "你的成绩为${A}分,你上课是在开飞机吗?考那么点。"
fi


通过stty可以实现让用户在输入值时隐藏输入内容

#!/bin/bash
stty -echo
read -p "请输入你的密码:" password
#echo $password
stty echo            //在使用stty -echo 后一定要结束使用stty,否则无法正常显示再次输入的内容。
# read -s -p "输入密码:" ABC     也可实现以上功能

read -n 8 abc            //-n表示设置用户输入字符的数量,达到该值自动提交
举例:
#!/bin/bash
echo "输入密码:"
stty -echo
read -n 8 password
stty echo

# read -s -t 2 var    //-t 限制时间内输入内容,默认单位为秒

# read -d "#" var      //以特定字符结尾,如打10086要求输入身份证并以#号结尾
aaaaa#[root@pillarx1m ~]# 


2.for
自动创建多个已定义的用户名及相同的密码:
# vim a.txt
a
b
c
d
e
# vim a.sh
#/bin/bash
ABC=`cat /root/a.txt`
for name in $ABC
do  useradd $name
    echo "redhat" | passwd --stdin $name
done


########思考:
根据已定义的用户列表创建相关用户及与用户名相同的密码:


#!/bin/bash
B=`cat /root/user.txt`
NULL="/dev/null"
for A in $B
do
        useradd $A &> $NULL
        echo "$A" | passwd --stdin $A &> $NULL
done

根据列出的主机IP,判断这些主机是否能够通信:
# vim ipadds.txt
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
# vim chkhosts.sh
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
    if [ $? -eq 0 ] ; then
        echo "Host $IP is up."
    else
        echo "Host $IP is down."
    fi
done

-c    //发送包个数
-i    //每个包发送间隔,单位为秒
-W    //等待数据包回应时间,网络延迟低时可以设置为1,网络延迟高可设置高些。


按照递增顺序创建20个用户及设置密码:
通过命令批量创建多个用户:
# echo abc{01..10} |xargs -n1 | sed -r 's#(.*)#useradd \1#g' | bash
xargs -n1        //换行显示
-r    //因为用到了(),因此要使用-r启用sed的扩展正则
s#(.*)#useradd \1#g   //将括号(括号中的内容就是通过echo输出的内容)里的内容替换为useradd,再通过\1将之前括号里的东西输出到替换后的命令后面,最终结果就是:useradd abc01 -10
再通过最后的bash将之前生成的命令执行,即可创建10个用户。

通过命令批量创建多个用户及相同的密码:
# echo abc{01..10} |xargs -n1 | sed -r 's#(.*)#useradd \1;echo 123456 | passwd --stdin \1#g' | bash

通过命令批量创建多个用户及不同的密码:
# echo abc{01..10} |xargs -n1 | sed -r 's#(.*)#useradd \1;echo \1 | passwd --stdin \1#g' | bash

3.while


# vim uaddwhile.sh
#!/bin/bash
PREFIX="satu"
Uid=1
#定义自增量
while [ $Uid -le 20 ]
do
    useradd ${PREFIX}$Uid
    echo "123456" | passwd --stdin ${PREFIX}$Uid &> /dev/null
#    let Uid++
done


let Uid++    //表示在Uid的基础上+1,以实现递增功能
let Uid+=10    //增加
let Uid-=1    //减


创建用户时编号以10位递增:
#!/bin/bash
PREFIX="aaa"
Uid=10
while [ $Uid -le 100 ]
do
    useradd ${PREFIX}$Uid
    echo "123456" | passwd --stdin ${PREFIX}$Uid &> /dev/null
    let Uid+=10
done


# $RANDOM 在每次调用的时候,返回一个不同的随机整数
# 指定的范围是: 0 - 32767 
# echo ${RANDOM:0:2}        //表示取随机数,但是该数从0开始且只有2位数,":2"为值的位数,最高5位数
如果我们想要产生0-25范围内的数,如何做呢?如下:
# echo $(expr $RANDOM % 26)
用这个环境变量对26取模,就可以得到最小是0,最大是25的数了。
如果想得到1--68范围内的数,可以这样
# echo $(expr $RANDOM % 68 + 1)
前面可以得到最小为0,最大为67的随机数,再加上1,很自然的就可以得到最大为1,最小为68的数了。
如果想得到6--87范围内的数。可以这样
# echo $(expr $RANDOM % 82 + 6)
10-100
 echo $(expr $RANDOM %  91 + 10)
前面可以得到最小为0,最大为81的随机数,再加上6,很自然的就可以得到最大为87,最小为6的数了。

# vim guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
    read -p "请输入你猜测的价格数目:" INT
    let TIMES++
    if [ $INT -eq $PRICE ] ; then
        echo "恭喜你答对了,  实际价格是 $PRICE"
        echo "你总共猜测了 $TIMES 次"
        exit 0
    elif [ $INT -gt $PRICE ] ; then
        echo "太高了!"
    else
        echo "太低了!"
    fi
done


1.通过while循环实现以下效果:
[root@pillar1m ~]# bash 10.sh 
5
4
3
2
1

(1)case语句和if条件语句的适用性
case语句比较适合变量值较少且为固定的数字或字符串集合的情况,如果变量的值是已知固定的start/stop/restart等元素,那么采用case语句来实现就比较适合。
(2)case语句和if条件语句的常见应用场景
case主要是写服务的启动脚本。
if就是取值判断、比较,应用面比case更广。
几乎所有的case语句都可以用if条件语句来实现。
(3)case语句的特点及优势
case语句就相当于多分支的if/elif/else语句,但是case语句的优势是更规范、易读。

当变量的值等于值1时,执行指令1;等于值2时执行指令2,以此类推;如果都不符合,则执行"*)"后面的指令。

判断用户键入的字符类型:
# cat hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
  [a-z]|[A-Z])  
      echo "您输入的是 字母。"
      ;;
  [0-9])
      echo "您输入的是 数字。"
      ;;
  *)
      echo "您输入的是 空格、功能键或其他控制字符。"
esac

编写服务控制脚本:
#!/bin/bash
# chkconfig: - 85 15
case "$1" in
  start)
        /usr/sbin/apachectl start
        echo "正在启动服务:httpd,-----服务启动成功!"
        ;;
  stop)
        /usr/sbin/apachectl stop
        echo "正在停止服务:httpd,-----服务停止成功!"
        ;;
  *)
        echo $"请参照以下规则输入: {start|stop}"
esac
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值