shell编程入门--条件语句与循环语句

shell作为一种脚本编程语言,同样包含循环、分支等其他程序控制结构,从而轻松完成更加复杂、强大的功能

循环语句

<1>for循环

for 条件
do
    动作
done

循环方式:

<1> for 变量名 in 变量遍历列表     

举例:  

for NUM in {1..5}

for NUM in "1 2 3" "abc"

[root@server script]# vim for.sh

for NUM in "1 2 3" "abc"
do
   echo $NUM
done

[root@server script]# sh for.sh
1 2 3
abc

<2 >for ((a=1;a<=10;a++))

<3>for NUM in `seq 1 2 10`   ##以命令的结果作为变量的便历列表

seq命令:不设置步长时默认步长为1

练习:

<1>编写脚本测试172.25.254网段中的主机网是否是通的

#!/bin/bash
for ((a=1;a<255;a++))
do
   ping -w1 -c1 172.25.254.$a &> /dev/null && echo "172.25.254.$a is up" || echo "172.25.254.$a is down"
done

<2>编写脚本实现倒计时10秒

#!/bin/bash
for ((a=10;a>=0;a--))
do
   echo -n " TIME $a "
   echo -ne "\r"
   sleep 1
done

<2>编写脚本实现从输入的分钟数和秒数开始进行时间的倒计

(1)将分钟转化为秒数实现

#!/bin/bash
read -p "请输入分钟数和秒数: " i j
t=i*60+j
for((t;t>0;t--))
do
   m=$[t/60]
   s=$[t%60]
   echo -n " TIME $m:$s "
   echo -ne "\r"
   sleep 1
done

(2)双循环实现

#!/bin/bash
read -p "请输入分钟数与秒数:" i j
for ((m=$i;m>=0;m--))
do
   for ((s=$j;s>=0 && s<60;s-- ))
   do
      echo -n " TIME $m:$s "
      echo -ne "\r"
      sleep 1
      if [ $s == 0 ];then
           j=59
      fi
   done
done

<2>编写脚本实现打印9*9乘法表

##打印9*9乘法表
#1*1=1
#2*1=2 2*2=4
#3*1=3 3*2=6 3*3=9

.....

#!/bin/bash
#for i in $(seq 9)
for ((i=1;i<10;i++))
do
   #for j in $(seq $i)
   for ((j=1;j<=i;j++))
   do
     echo -ne "$i*$j=$[$i*$j]\t"  
   done
   echo -e "\n"    ##   \r (return)就是回到本行行首,这就会把这一行以前的输出覆盖掉

  # echo -e "\r"    ##   \n (newline)是回车+换行 把光标 先移到 行首 然后换到下一行 也就是下一行的行首
done

程序运行结果:

<2>while循环

for语句适用于列表对象无规律,且列表来源以固定的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定的条件重复操作等情况,则更适合于while循环语句

只要while后面的条件满足,就一直执行do里面的代码块。

while 条件
do
    动作
done

练习:

编写一个脚本,使用循环语句新建用户westos{1..20},且设置这些用户的密码都为"123456"

#!/bin/bash
PREFIX="westos"
i=1
while [ $i -le 20 ]
do
   useradd ${PREFIX}$i &> /dev/null
   echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
   ((i++))
done

执行脚本的结果:

条件语句

<1>if语句

 和C语言类似,在Shell中用if、then、elif、else、fi这⼏条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命令组成的

if [ 条件判断 ];then              ##条件判断和方括号[ ]之间必须有空格,否则会有语法错误。
    动作1
elif
    动作2
elif
    动作3
else
    动作4
fi

练习:

<1>

#!/bin/bash
user=student
if grep $user /etc/passwd;then
    echo "The files for user $user are:"
    ls -a /home/$user
else
    echo "$user not exist!"
fi

脚本运行结果:

<2>

#!/bin/bash
if [ -z $1 ];then
    echo "Please input a user"
elif [ "$1" == "harry" ];then
    echo "Welcom $1"
elif [ "$1" == "Jimmy" ];then
    echo "Welcom $1"
elif [ "$1" == "tommy" ];then
    echo "Welcom $1"
else
    echo "You are not allowed"
fi

执行脚本测试:

<2>case语句

case语句是用来实现多个if..else的功能的,case会对字符串进行匹配,是从第一个模式开始的,如果有一个模式已经匹配成功的话,其他的模式就不会再进行匹配了。

case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。与多分支if语句相识,只是if语句需要判断多个不同的条件,而case只是判断一个变量的不同取值

case语句的基本用法,记住每一个匹配后边都有双分号,代表本模式的结束和下一个模式的开始,再进行通配

单个匹配模式

case "$input" in

yes ) echo "yes";;

y* ) echo "y*";;

y ) echo "y";;

no ) echo "no";;

n ) echo "n";;

* ) echo "default";;

esac

练习:

#!/bin/bash
case $1 in
student)
     echo "Welcome,student"
     ;;
westos)
     echo "Welcome,westos"
     ;;
linux)
     echo "Welcome,linux"
     ;;
*)
     echo "Sorry!"
     ;;
esac

合并匹配模式,case的匹配只能匹配一条,想要做到匹配多个结果使用如下的方式

case "$input" in

y* | Y* ) echo "yes";;

n* | N* ) echo "no";;

* ) echo "default";;

esac

练习:

#!/bin/bash
case $1 in
student|kiosk|linux|westos)
     echo "Welcome,$1"
     ;;
*)
     echo "Sorry!"
     ;;
esac

练习:

编写脚本,实现交互式执行对应的程序功能

A   显示主机IP

B   显示磁盘剩余空间

C   显示系统运行时间

Q   退出系统

脚本编写如下:

#!/bin/bash
while true
do
   echo -e "
   \033[31m A 显示主机ip地址 \033[0m
   \033[32m B 显示磁盘剩余空间 \033[0m
   \033[33m C 显示系统运行时间 \033[0m
   \033[34m Q 退出系统 \033[0m
"
read -p "请输入选项:" char
case $char in
a|A)
    ifconfig eth0 | grep "inet " | awk '{print "本机ip为:"$2}'
    ;;
b|B)
    df -h | awk 'NR==2{print "剩余空间大小为:"$2}'
    ;;
c|C)
    uptime | awk '{print $3}' |awk -F, '{print $1}' | awk -F: '{print "系统已经>运行了"$1"小时"$2"分钟"}'
    ;;
q|Q)
    exit 0
    ;;
esac
done

运行脚本的结果如下所示:

猜你喜欢

转载自blog.csdn.net/weixin_40172997/article/details/85292984