shell脚本循环结构

Shell作为一种解释类型的脚本编程语言,同样包含顺序,分支,循环这些基本的程序控制结构。通过使用分支,循环等控制语句,可以编写出应用更灵活,功能更强大的Shell管理脚本.一下是对if,for,while语句的应用,shell脚本程序的结构控制,case语句,shell函数应用等的介绍:

test命令
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test  条件表达式
[   条件表达式   ]          中间至少相隔一个空格
测试文件状态:
-d:测试是否为目录           输入 [ -d /etc/vsftpd ] 后再输入 echo $?  返回值为0表示测试条件成立,为1时表示不成立
-e:测试目录或文件是否存在    [ -e /media/cdrom/Server ]  &&  echo "YES"   返回yes表示测试条件成立,无显示表示失败。
-f:测试是否为文件
-r:测试当前用户是否有读取权限
-w:测试当前用户是否有写入权限
-x:测试当前用户是否有执行权限
-L:测试是否为符号链接文件

数值比较:
格式:[  整数1  操作符  整数2  ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

字符串比较
格式:[  字符串1  =  字符串2 ]
[  字符串1  !=  字符串2 ]
[  -z  字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空

1

2
[root@localhost ~]#touch zero.file
[root@localhost ~]# [ -z `cat zero.file` ] && echo "YES"   表示为空文件

逻辑测试
格式:[  表达式1  ]  操作符  [  表达式2  ]  ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
前后两个表达式都成立时整个测试结果才为真,否则为假
-o或||:逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否
当指定的条件不成立时,返回结果为真

单分支if 语句的结构
if  条件测试命令
then   命令序列
fi
例如:如果/boot分区的空间使用超过80%,输出报警信息

1

2

3

4

5

6
#!/bin/bash
RATE=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 `
if [ $RATE -gt 80 ]
then
echo "Warning,DISK is full!"
fi

双分支的if语句
if  条件测试命令
then   命令序列1
else   命令序列2
fi
例如:判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务

1

2

3

4

5

6

7

8
#!/bin/bash
service mysqld status &> /dev/null
if  [  $?  -eq  0  ]
    then
        echo  "mysqld service is running."
    else
        /etc/init.d/mysqld  restart
fi


多分支的if语句:
if  条件测试命令1  ;  then
命令序列1
elif  条件测试命令2  ;  then
命令序列2
elif  ...
else
命令序列n
fi


for循环语句:
for  变量名  in  取值列表
do
命令序列
done
例如:依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串

1

2

3

4

5

6

7

8

9

10
# vi showday.sh
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
    echo "The $TM of the day."
done
[root@localhost ~]# sh showday.sh
The Morning of the day.
The Noon of the day.
The Evening of the day

例如:对于使用/bin/bash作为登录shell的系统用户,检查他们在/opt目录中拥有的子目录或文件数量,如果超过100个,则列出具体数值及对应的用户账号。

1

2

3

4

5

6

7

8

9

10

11
#!/bin/bash
DIR="/opt"
LMT=100
ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1`
for UserName  in  $ValidUsers
do
    Num=`find $DIR -user $UserName | wc -l`
    if  [  $Num  -gt  $LMT  ]  ;  then
         echo "$UserName have $Num files."
    fi
done

 


 while语句的结构:
while  命令或表达式
do
命令列表
done
例如:批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
这些用户的初始密码均设置为“123456”

1

2

3

4

5

6

7

8
#!/bin/bash
i=1
while  [  $i  -le  20  ]
do
    useradd stu$i
    echo "123456" | passwd --stdin stu$i &> /dev/null
    i=`expr $i + 1`
done


case语句:
case  变量值  in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认执行的命令序列
esac
例如:提示用户从键盘输入一个字符,判断该字符是否为字母、数字或者其它字符,并输出相应的提示信息

1

2

3

4

5

6

7

8

9

10

11

12
#!/bin/bash
read  -p  "Press some key, then press Return:“  KEY
case  "$KEY“  in
  [a-z]|[A-Z])
      echo "It's a letter."
      ;;
  [0-9])
      echo "It's a digit."
      ;;
  *)
      echo "It's function keys、Spacebar or other keys. "
esac


until循环:和while循环类似,只不过while是当条件成立时执行,而until是当测试条件成立时结束循环。
until  条件测试命令
do
命令序列
done


shift语句:用于迁移位置变量,将 $1~$9 依次向左传递
例如,若当前脚本程序获得的位置变量如下:
$1=file1、$2=file2、$3=file3、$4=file4
则执行一次shift命令后,各位置变量为:
$1=file2、$2=file3、$3=file4
再次执行shift命令后,各位置变量为:
$1=file3、$2=file4
应用示例:
通过命令行参数传递多个整数值,并计算总和

1

2

3

4

5

6

7

8

9

10

11
# vi showday.sh
#!/bin/bash
Result=0
while  [  $#  -gt  0  ]
do
    Result=`expr $Result + $1`
    shift
done
echo "The sum is : $Result"
[root@localhost ~]# ./sumer.sh  12  34  56
The sum is : 102

break 命令:在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体后的语句
continue:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环

Shell 函数的应用:在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数
合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率
格式:
function 函数名 {
命令序列
}
或者把function去掉也可以。

标签: 无
返回文章列表 文章二维码
本页链接的二维码
打赏二维码