条件判断(if,case)和循环(for,until,while等)详解(附例题正解)

脚本中的if条件判断和循环

在linux下,写脚本是我们必不可少的。在写脚本的过程中,if判断和各种的循环是我们常用的。这里,详细的说一下条件判断以及循环的使用。

条件判断:if 和 else

1.if

shell程序中的条件分支是通过if条件语句来实现的,其格式一般为if -then -fi ,这样的是单分支语句,还有的一种就是if-then-else-fi两种。

(1)if-then语法格式:   #由于粘贴图片易乱格式,为方便观看,我直接附上正解源码,带结果

if 命令行

then 

命令行

fi 

(2)if-then-else-fi语法格式

if  CONDITION1; then

if-true

elif CONDITION2; then

if-ture

elif CONDITION3; then

if-ture

else

all-false

fi 

这个主要还是通过案例,多练习才能熟练的使用。下面我会做一些案例供参考。

2.case

if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式为:

case string in

pat1)

command1

;;

pat2)

command2

;;

……

*)

other command

esac

其中case支持使用shell的通配符("*","?","[]"),通常用*作为case命令的最后运算式以便在前面找不到相应的匹配项时执行“其他命令行”的命令。

1、写一个脚本/root/bin/createuser.sh,实现如下功能:

使用一个用户名做为参数,如果指定参数的用户存在,就显

示其存在,否则添加之;显示添加的用户的id号等信息

[root@localhost 0812]# ls /home

alice  bash  basher  gentoo  gentoo1  kk  nologin  test1  testbash  tom

[root@localhost 0812]# bash iftest1.sh 

Please input one username:kk

The user is exist

uid=1000(kk) gid=1000(kk) groups=1000(kk),10(wheel)

[root@localhost 0812]# bash iftest1.sh 

Please input one username:zz

Add zz finished

uid=2018(zz) gid=2018(zz) groups=2018(zz)

[root@localhost 0812]# ls /home

alice  bash  basher  gentoo  gentoo1  kk  nologin  test1  testbash  tom  zz

[root@localhost 0812]# cat iftest1.sh 

#!/bin/bash

#

read -p "Please input one username:" username

if  grep ^$username.* /etc/passwd &> /dev/null ;then

echo "The user is exist"

echo "`id $username`"

else

useradd $username

echo "Add $username finished"

echo "`id $username`"

fi

[root@localhost 0812]# 

2、写一个脚本/root/bin/yesorno.sh,提示用户输入yes或

no,并判断用户输入的是yes还是no,或是其它信息

read -p "please enter [yes] or [no]:" so

case $so in

[Yy]|[Yy][Ee][Ss])

echo your choice is yes! ;;

[Nn]|[Nn][Oo])

echo your choice is no! ;;

*)

echo unknown ;;

esac

3、写一个脚本/root/bin/filetype.sh,判断用户输入文件路

径,显示其文件类型(普通,目录,链接,其它文件类型)

#参考下面的/var/下文件的判断

4、写一个脚本/root/bin/checkint.sh,判断用户输入的参数

是否为正整

[root@localhost 0812]# vi 判断参数.sh

[root@localhost 0812]# bash 判断参数.sh 

Please input one number:

At least input one number 

[root@localhost 0812]# bash 判断参数.sh 

Please input one number:ee

“error”

[root@localhost 0812]# bash 判断参数.sh 

Please input one number:55

The num type is int

[root@localhost 0812]# cat 判断参数.sh 

#!/bin/bash

#

read -p 'Please input one number:' num

if [ -z $num ];then

echo "At least input one number "

exit 1

fi

if [[ $num =~ ^[1-9]{1,} ]];then

echo "The num type is int"

else

echo “error”

fi

[root@localhost 0812]# 

3.for

for 变量名 in 列表;do

循环体

done

 

依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

列表生成方式:

(1) 直接给出列表

(2) 整数列表:

(a) {start..end}

(b) $(seq [start [step]] end)

(3) 返回列表的命令

$(COMMAND)

(4) 使用glob,如:*.sh

(5) 变量引用;$@, $*

1、判断/var/目录下所有文件的类型

[root@localhost d0816]# vi 查看文件类型2.sh

[root@localhost d0816]# bash 查看文件类型2.sh 

The account type is :d

The adm type is :d

The cache type is :d

The crash type is :d

The db type is :d

The empty type is :d

The games type is :d

The gopher type is :d

The kerberos type is :d

The l2a type is :f

The lib type is :d

The local type is :d

The lock type is :d

The log type is :d

The mail type is :d

The nis type is :d

The opt type is :d

The preserve type is :d

The run type is :d

The spool type is :d

The tmp type is :d

The yp type is :d

[root@localhost d0816]# ls /var

account  cache  db     games   kerberos  lib    lock  mail  opt       run    tmp

adm      crash  empty  gopher  l2a       local  log   nis   preserve  spool  yp

[root@localhost d0816]# cat 查看文件类型2.sh 

#!/bin/bash

#

for name in `ls /var/.`

do

if [ -f /var/$name ];then

echo "The $name type is :f"

elif [ -d /var/$name ];then

echo "The $name type is :d"

elif [  -h /var/$name ];then

echo "The $name type is :link"

else

echo "The $name type is :other"

fi

done

2、添加10个用户user1-user10,密码同用户名

[root@localhost bin]# cat adduser.sh 

#!/bin/bash

#

for num in `seq 1 10`;do

if id user$num&>/dev/null;then

echo "user$num exist!";continue

else

useradd user$num&&echo "user$num"|passwd –stdin user$num

fi

done

 3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的

文件;分别读取每个文件,以K开头的文件输出为文件加stop

,以S开头的文件输出为文件名加start;

“K34filename stop”

“S66filename start”

[root@localhost d0816]# vi KS.sh

[root@localhost d0816]# bash KS.sh

K50netconsole stop

S10network start

[root@localhost d0816]# cat KS.sh

#!/bin/bash

#

for name in `ls /etc/rc.d/rc3.d`

do

if [[ $name =~ ^K.* ]];then

echo "$name stop"

fi

if [[ $name =~ ^S.* ]];then

echo "$name start"

fi

done

 4、写一个脚本,提示输入正整数n的值,计算1+2+3+…n的

总和

[root@localhost d0816]# bash 1-n和.sh 

Please input int number:5

The 1-5的和为:15

[root@localhost d0816]# bash 1-n和.sh 

Please input int number:3

The 1-3的和为:6

[root@localhost d0816]# cat ./1

100sum.sh  1-n和.sh   

[root@localhost d0816]# cat ./1-n和.sh 

#!/bin/bash

#

read -p 'Please input int number:' num

if [ $num -lt 1 ];then

echo "Aleast input one number"

exit 1

fi

sum=0

for n in $(seq 1 $num)

do

let sum=$sum+$n

done

echo "The 1-$n的和为:$sum"

 

 5、写一个脚本,提示请输入网络地址,如192.168.0.0,判

断输入的网段中主机在线状态

[root@localhost bin]# cat updown.sh 

#!/bin/bash

#

read -p "please enter a ip address:" ipaddr

ip=`echo "$ipaddr"|egrep -o "^[[:digit:]]{1,3}\.[[:digit:]]{1,3}."`

#echo "$ip"

echo

nu=0

nd=0

#for i in `seq 0 254`;do

for j in `seq 1 255`;do

if ping -W1 -c1 ${ip}252.${j} &>/dev/null ;then

let nu++

echo -e "\n\t\t${ip}252.${j}  is up  $nu"

else

let nd++

echo -e "\b\r$nd down"

fi

done

#done

4.while

while CONDITION; do

循环体

done

 CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行

一次循环;直到条件测试状态为“false”终止循环.

5.until 

 until CONDITION; do

循环体

 done

 进入条件: CONDITION 为false

 退出条件: CONDITION 为true

1、求100以内所有正整数之和

[root@localhost bin]# cat sum100.sh 

#!/bin/bash

#

i=1

while [ $i -le 100 ];do

let s=s+i

let i++

done

echo "$s"

2、通过ping命令探测172.16.250.1-254范围内的所有主机

的在线状态,统计在线主机和离线主机各多少。

[root@localhost until]# cat ping10.sh 

#!/bin/bash

#

i=1

NumUp=0

NumDown=0

echo

until [ $i -gt 254 ];do

if ping -W1 -c1 10.1.252.$i &>/dev/null ;then

let NumUp++

echo -e "\n\t\t 10.1.252.$i  is up  $NumUp"

    else

        let NumDown++

echo -e "\b\r$NumDown down"

    fi

let i++

done

 3、打印九九乘法表

#!/bin/bash

#

i=1

j=1

while [ $i -le 9 ]

do

for j in `seq 1 $i`

do

echo -ne "$j*$i=$[i*j]\t"

done

let i++

echo

done

4、利用变量RANDOM生成10个随机数字,输出这个10数字

,并显示其中的最大者和最小者

[root@localhost bin]# vi random.sh 

[root@localhost bin]# bash random.sh 

19182

The max number is 29660,The min number is 1200

[root@localhost bin]# cat random.sh

#!/bin/bash

#

i=1

random=$RANDOM

max=$random

min=$random

echo "$random"

while [ $i -le 10 ]

do

random=$RANDOM

if [[ $random -ge $max ]];then

max=$random

fi

if [[ $random -le $min ]];then

min=$random

fi

let i++

done

echo "The max number is $max,The min number is $min"

 5、打印国际象棋棋盘

root@localhost bin]# cat chess.sh 

#!/bin/bash

#

line=1

i=8

while [ $line -le 8 ] ;do

j=$line

while [ $j -le $i ] ;do

co=$[$j%2]

if [ $co -eq 1 ];then

echo -ne "\033[47m  \033[0m"

else

echo -ne "\033[40m  \033[0m"

fi

let j++

done

echo

let line++

let i++

done

原创文章,作者:zhong,如若转载,请注明出处:http://www.178linux.com/37090

(0)
zhongzhong
上一篇 2016-08-18
下一篇 2016-08-18

相关推荐

  • DNS原理详解

    1、DNS概述   domain name service  区域名称服务或者domain named system 区域名称系统,是互联网最基础的服务,分为正向域名解析(将域名解析为IP地址)和反向域名解析(将IP地址解析为域名)两部分。 2、bind   bind(Berkeley Internet Name Domain)…

    Linux干货 2016-08-26
  • bash脚本编程

    Linux脚本编程中bash常用的测试类型:                 整数测试:       -gt greater than  大于    …

    Linux干货 2016-08-18
  • Linux发展史

    简 述 Linux是一套自由加开放源代码的类Unix操作系统,诞生于1991年10月5日(第一次正式向外公布),由芬兰学生Linus Torvalds和后来陆续加入的众多爱好者共同开发完成。 Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议,可支持32位和64位硬件。…

    2016-10-14
  • mysql 备份脚本的编写

        最近在为做一些边边角角的工作,现在有一个需求要每天把mysql的数据库dump出来到备份机器上面去. 看似简单的任务也潜在了很多的需求,整理如下:     自动运行-crontab      脚本的环境变量设置-由于通过crontab 启动执…

    Linux干货 2015-12-15
  • 第五周作业

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost ~]# awk -F: '/^(root|user1|fedora)/{print $1,"shell is",$NF}' /etc/pass…

    Linux干货 2016-09-15
  • Linux 网络属性管理

    在介绍Linux网路属性管理之前,我还要介绍下以太网(Enternet) 以太网的工作原理 以太网才用带冲突检测的载波侦听多路访问(CSMA/CD)机制。以太网中节点都可以看到在网络中发送的所有信息,因此,我们说以太网是一种广播网络。 以太网的工作过程如下: 当以太网中的一台主机要传输数据时,它将按如下步骤进行: 1.监听信道上是否有信号在传输。如果有的话,…

    Linux干货 2016-03-20