循环语句总结

本文详细介绍流程控制语句之循环语句,依次如下:

1,for循环语句一般使用与特殊使用

2,while循环语句一般使用与特俗使用的

3,until语句使用

4,循环控制:continue,break在循环语句中的使用

5,函数的使用

1,for循环语句

for循环一般格式为:列表依次匹配变量,do后面是执行体。列表默认为一个或者多个空格或者TAB间隔


for 变量 in 列表

do

    command1

    command2

    ...

    commandN

done


示例:列出1到5数字

wKiom1X6LbKySqejAAB-mvRQb3k030.jpg

示例:command使用命令引用

wKiom1X6LqHx8LMNAAB6sCE7Tgo755.jpgwKioL1X6MWaR3PSSAACLW2uCA_g449.jpg

for循环的特殊用法:for((赋值;条件;运算语句))

for ((expr1;expr2;expr3)); do

循环体

done


expr1: 定义控制变量,并初始赋值;

expr2: 循环控制条件;

进入条件:控制条件为“真”

退出条件:控制条件为“假”

expr3: 修正控制变量


示例:求100以内所有正整数之和;

sum+=i 就是将sum,i的和赋给sum

sum +=$i  就是将sum和变量$i的和赋给sum

i++和i+=1是一个意思,把i和1的和赋予i

wKioL1X6MffiBDFkAADGXqLr310881.jpg

2,while循环语句

while循环一般格式语法:


while CONDTION; do

循环体

done


进入条件:当CONDITION为“真”;

退出条件:当CONDITION为“假”;


while CONDITION; do

循环体

控制变量的修正表达式

done


示例:求100以内所有正整数之和;

wKiom1X6MTWiX-JPAACgpkfwb0s052.jpg


while循环的特殊用法:

遍历文件的每一行:

while read VARIABLE; do

循环体

done < /PATH/FROM/SOME_FILE


示例:找出UID为偶数的所有用户,显示其用户名和ID号;

wKiom1X6MybzY_ojAAHCpypEc8Y110.jpg

举例:

ip.txt内容如下:

10.1.1.11 root 123
10.1.1.22 root 111
10.1.1.33 root 123456
10.1.1.44 root 54321

 

写法1:后面ip,user,pass正好要对应文件的三列,就可以单独取出列内容了

cat ip.txt | while read ip user pass
do
    echo "$ip--$user--$pass"
done

 

写法2:

while read ip user pass
do
    echo "$ip--$user--$pass"
done < ip.txt

 

使用IFS作为分隔符读文件

说明:默认情况下IFS是空格,如果需要使用其它的需要重新赋值

IFS=:

例如:

# cat test
chen:222:gogo
jie:333:hehe
# cat test.sh
#!/bin/bash
IFS=:
cat test | while read a1 a2 a3
do
    echo "$a1--$a2--$a3"
done


3,unitl循环

unitl循环语句格式:

until CONDITION; do

循环体

循环控制变量的修正表达式

done


进入条件:当CONDITION为“假”时

退出条件:当CONDITION为“真”时


示例:求100以内所有正整数之和

wKioL1X6NpjiCEwTAADatM875AQ147.jpg


4,循环控制(break,continue)


循环控制含义:

# break 命令不执行当前循环体内break下面的语句从当前循环退出. 

# continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行

break [n]:提前结束循环;[n]表示跳出(结束)几层循环

continue [n]:提前结束本轮循环,而直接进入下一轮;[n]继续循环进入第几轮

循环控制的使用:

while循环:

while CONDITION; do

.......

if CONDITION2; then

break [n]

fi

done


while CONDITION; do

......

if CONDITION2; then

continue [n]

fi

......

done


示例:求100以内所有偶数之和;continue使用

wKioL1X6PPSiYnLmAAG8uHQUVVg581.jpg

死循环:

while true; do

循环体

if CONDTION; then

break

fi

done


until false; do

循环体

if CONDITION; then

break

fi

done


示例:每隔3秒钟查看当前系统上是否有名为“gentoo”的用户登录;

如果某次查看gentoo登录了,则显示gentoo已经登录;

如果未登录,就显示仍然未来,并显示这是已经是第多少次查看了;

注意break使用

while使用break

wKioL1X6P6DhUgqDAAIKmpOc5NI673.jpg

until使用break

wKiom1X6PmLBfANhAAIapd7SDW4685.jpg


5,函数的使用

函数使用:

function: 功能

把一段具有独立功能代码封装在一起,并给予命名;后续用到时,可直接通过给定函数名来


调用整体代码;

函数作用:代码重用;模块化编程;

函数的使用方法:

先定义:编写函数代码

后调用:给出函数名,还可按需传递参数


定义方法:

(1) function f_name {

函数体

}

(2) f_name() {

函数体

}

调用函数:

f_name [argu1, argu2, ...]


自定义函数状态返回值:

return [#]

0: 成功

1-255:失败

注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;


示例:执行start,stop,restart分别实现文件状态判断:

将start,stop,restart做为函数体,case使用模块调用函数。

#!/bin/bash
#
prog=$(basename $0)
lockfile="/var/lock/subsys/$prog"
#echo $lockfile
if [ $# -lt 1 ]; then
   echo "Usage: $prog start|stop|restart|status"
   exit 1
fi
start() {
   if [ -f $lockfile ]; then
echo "$prog is started yet."
   else
touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog 
failed..."
   fi
}
stop() {
   if [ -f $lockfile ]; then
rm -f $lockfile && echo "Stop $prog ok...." || echo "Stop $prog failed..."
   else
echo "$prog is stopped yet."
   fi
}
restart() {
   if [ -f $lockfile ]; then
rm -f $lockfile && touch $lockfile && echo "Restarting $porg ok..."
   else
touch $lockfile && echo "$prog is stopped, Starting $prog ok...."
   fi
}
status() {
   if [ -f $lockfile ]; then
echo "Running..."
   else
echo "Stopped..."
   fi
}
case $1 in
start)
   start 
   ;;
stop)
   stop
   ;;
restart)
   restart
   ;;
status)
   status
   ;;
*)
   echo "Usage: $prog start|stop|restart|sttus"
   exit 1
esac
[root@os01 /]# ./test.sh start
Starting test.sh ok...
[root@os01 /]# cd /var/lock/subsys/
[root@os01 subsys]# ls
network  test.sh                        #start创建了test.sh文件
[root@os01 subsys]# cd -
[root@os01 /]# ./test.sh stop
[root@os01 /]# cd -
[root@os01 subsys]# ls
network                                  #stop删除了test.sh文件
[root@os01 subsys]# cd -
[root@os01 /]# ./test.sh restart
[root@os01 /]# cd -
[root@os01 subsys]# ls
network  test.sh                           #restart执行了先删除再创建test.sh文件

函数模块化调用

模块化编程

功能:把脚本文件中的代码分隔为多段,放在不同的文件中

假设/root/bin/srv目录有两个文件:

(1) 函数文件

(2) 脚本文件


为脚本使用配置文件

一个文件中只定义变量

脚本文件source此变量定义的文件


变量的作用域:

局部变量:

local VARIABLE=value


存活时间:

函数执行开始,至函数返回结束;

示例:test01.sh函数定义变量,test02.sh脚本引用test01.sh

wKiom1X6RqeBRLYXAAF5rwFosAQ220.jpg