shell基础之四:函数、死循环及for,while特殊用法

一:死循环

语法1:

    while true;do

           循环体

           if CONDITION;then

               break

            fi

     done

语法2:

     until false;do

            循环体

             if CONDITION;then

                 break

             fi

      done

  就是一直循环直到某个条件出现才结束咯


例:

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

   如果登录了,则显示gentoo已经登录;如果未登录就显示仍未登录,并显示这是第几次查看了

[root@BAIYU_110 shell]# cat 12.sh
#!/bin/bash        # 用变量替换“gentoo”和相应的命令就可以实现服务或用户上线下线提醒    
#
declare -i i=0
while true;do
     if who|grep "gentoo" &>/dev/null;then
        echo "The gentoo is logged"
        break
     fi
     let i++
     echo "$i gentoo is not login"
     sleep 3
done
[root@BAIYU_110 shell]# bash 12.sh
1 gentoo is not login
2 gentoo is not login
3 gentoo is not login
4 gentoo is not login
5 gentoo is not login
6 gentoo is not login
7 gentoo is not login
8 gentoo is not login
^C


二、while、for的特殊用法

while循环的特殊用法:

      遍历文件的每一行

语法:

    while read VARIABLE;do

           循环体

     done < /FILENAME

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

[root@BAIYU_110 shell]# cat 13.sh
#!/bin/bash
#
while read line;do
      userid=$(echo $line|cut -d: -f3)
      if [ $[$userid%2] -eq 0 ];then
         echo $line | cut -d: -f1,3
      fi
done</etc/passwd
[root@BAIYU_110 shell]# bash 13.sh
root:0
daemon:2
mail:8
haldaemon:68
ntp:38
sshd:74
tcpdump:72
gentoo:500



for循环的特殊用法

语法:

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

          循环体

     done

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

expr2:循环控制条件

expr3:修正控制变量


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

[root@BAIYU_110 shell]# cat 14.sh
#!/bin/bash
for ((i=1;i<=100;i++));do
    let sum+=$i
done
echo "The sum is $sum"
[root@BAIYU_110 shell]# bash 14.sh
The sum is 5050

打印九九乘法表

[root@BAIYU_110 shell]# cat 15.sh
#!/bin/bash
#
for ((x=1;x<=9;x++));do             # 在这种特定格式下数字比较也可以直接使用<=号了
    for ((y=1;y<=$x;y++));do
       echo -n -e "${y}x${x}=$[$y*$x]\t"
    done
    echo
done
[root@BAIYU_110 shell]# bash 15.sh
1x1=1
1x2=2   2x2=4
1x3=3   2x3=6   3x3=9
1x4=4   2x4=8   3x4=12  4x4=16
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81
[root@BAIYU_110 shell]#



三、函数

    function:功能

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

函数的作用

          代码重用

          模块化编程

函数的使用方法:

       先定义:编写函数代码

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

定义方法:

语法1:

    function NAME {

             函数体

    }

语法2:

    NAME () {

        函数体

调用函数:

NAME [argu1,argu2...] 可接参数1,参数2。。。

自定义函数状态返回值:

return [#]

0:成功

1-255:失败

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

[root@BAIYU_110 shell]# cat 12.sh
#!/bin/bash
#
checkuser(){
declare -i i=0
while true;do
     if who|grep "gentoo" &>/dev/null;then
        echo "The gentoo is logged"
        break
     fi
     let i++
     echo "$i gentoo is not login"
     sleep 3
return 33
done
}
checkuser
echo aaaaaaaaaaaaaa
[root@BAIYU_110 shell]# bash 12.sh
1 gentoo is not login
aaaaaaaaaaaaaa
[root@BAIYU_110 shell]# echo $?    # 函数的执行状态返回值和命令执行状态返回值貌似没啥关系
0



四、模块化编程

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

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

   (1) 函数文件

   (2) 脚本文件


为脚本使用配置文件

一个文件中只定义变量

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


变量的作用域:

局部变量:

      local VARIABLE=value

存活时间:

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

[root@BAIYU_110 tmp]# cat test.sh 
sum1=1
sum2=2
[root@BAIYU_110 tmp]# cat test2.sh 
#!/bin/bash
#
. /tmp/test.sh
sum=$[$sum1+$sum2]
echo "$sum"
[root@BAIYU_110 tmp]# bash test2.sh 
3


五、bash信号捕获:

     kill -l

     kill 无法捕获

     trap "COMMAND" SIGNAL,


 信号捕获用于:

      在中途终止时做一些清理操作:


你可能感兴趣的:(函数,shell,死循环)