我们在上一篇文章中介绍了shell中各种括号,引号的使用语法,这篇文章我们将结合示例介绍一下shell中流程控制语句,如 ifforcase

一、if的语法:

if condition
  then
    ...  
  else
fi

if语法跟我们在php、java形式上有点区别。在满足if条件后我们需要在then中写流程代码,结尾是反写的if。

我们写一个真实的案例,来判断当前使用是否是root登录:

#!/bin/bash
user=$(env |grep USER | cut -d "=" -f 2 )

if [ $user == root ]
then
  echo "current user is root"
else
  echo $user
fi

运行上述代码,我们在env环境变量中获取到当前的用户信息,使用cut截取用户名,在[ ]做了条件判断。如果当前非 root 用户,将走进else语句

又一个示例,判断用户输入的是否是文件或目录:

#read 从标准输入读取数据到 dir中
#-t表示等待时间,-p 提示文字 
read -t 30 -p "请输入文件名:" dir
if [ -e $dir ]
    then
        echo "$dir 是文件或者目录"
        else
    echo "$dir 不是文件或者目录"
fi  

我们运行:

sh isfile.sh
请输入文件名:houger
houger 不是文件或者目录

我们来检测一下分区的使用率:

dev=$( df -h |grep "/$" |awk '{printf  $5 "\n"}'|cut -d "%" -f1)
# 获取跟分区使用率
if [ $dev -gt 13 ]
 then
   echo "使用率大于13"
 else
   echo "使用率不足13,使用率为$use"
fi

上述代码,df查看分区的使用情况,结合awkcut提取出使用率。

二、for的语法:

for i in items items2 ...
  do
    ...
  done

示例:

# 解压文件夹下所有压缩包
ls *.tar.gz > ls.log
#将所有压缩包追加到ls.log文件中
#for 循环解压ls.log中压缩包
for i in $(cat ls.log)
 do
   tar -zxf $i &> /dev/null
 done
rm -rf ls.log

我们将cat命令结果作用于当前行,循环读取文件名,在do代码体中解压文件。

三、case语法:

case 值 in
模式1)
    ...
    command
    ;;
模式2)
    ...
    command
    ;;
esac

case使用形式:取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;退出匹配。

如果无一匹配模式,使用星号 * 捕获该值(类似phpdefault)再执行后面的命令。

示例:

read -t 30 -p "请输入年龄:" age
case $age in
    "1")
        echo "年龄是10"
        ;;
    "2")
        echo "年龄是20"
        ;;
    *)
        echo "暂无"
        ;;
esac

我们读取用户输入age,进行匹配,如果匹配不到,就会走到 *代码体中。

四、while语句:

while condition
do
    command
done

示例:

num=1
while(( $num<=5 ))
do
    echo $num
    let "num++"
done

关于跳出循环操作:


如果我们想提前跳出循环,我们可以使用breakcontinue

break是跳出所有循环,即终止循环。

continue是跳出本次循环,进入下一循环,用法与php、java中一致,我们不做详细介绍。


五、我们编写一个综合案例,实现批量添加用户与批量删除用户:

批量添加

read -t 30 -p "请输入用户名:" name
read -t 30 -p "请输入数量:" num
read -t 30 -p "请输入密码:" pass

if [ ! -z $name -a ! -z $num -a ! -z $pass ]
then
    #判断输入的num是否是数字,对输入的数字替换为空
    y=$( echo $num | sed 's/[0-9]//g' )
    #如果为空,则输入的为纯数字
    if [ -z $y ]
    then
        for ((i=1;i<=$num;i=i+1))
        do
            /usr/sbin/useradd $name$i &>/dev/null
            echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
        done
    else
        echo "数量必须是数字"
    fi
fi

上述代码,我们从标准输入读取name(用户名) ,num(数量),pass(密码),我们在if中使用 -z判断用户输入长度是否为 0

批量删除:

users=$(cat /etc/passwd |grep /bin/bash |grep -v root |cut -d ":" -f1)
#批量删除非root用户
for i in $users
do
    if [ $i == 'root' ]
    then
        continue
    fi
    userdel -r  $i
done

往期:

shell 的入门学习笔记第一篇

shell中读取命令行参数第三篇

shell中函数使用教程第四篇


Leave Your Comment

电子邮件地址不会被公开。 必填项已用*标注