点我

shell语法

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

双分支举例

if    如果
then    那么
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

多分支举例

# 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 ~]# 

for

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,网络延迟高可设置高些。

while

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)
前面可以得到最小为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

case

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
分类: Linux

评论

-- 评论已关闭 --

目录