1、过程式编程语句的执行流程:

    顺序执行:从上至下一次执行

    选择执行:

        逻辑关系:&&、||、!

        if语句

            单分支if语句

            双分支if语句

            多分支if语句

        case语句

    循环执行:


2、if语句格式:

2.1、单分支if语句语法:

if CONDITION ;then

    IF-TRUE-STATEMENT

fi


或:

if CONDITION 

then

   IF-TRUE-STATEMENT

fi

2.2、双分支if语句语法:

if CONDITION;then

 IF-TRUE-STATEMENT

else

 IF-FALSE-STATEMENT

fi

2.3、多分支if语句语法:

if CONDITION1;then

   IF-TRUE1-STATEMENT

elif CONDITION2;then    

   IF-TRUE2-STATEMENT 

elif CONDITION3;then

   IF-TRUE3-STATEMENT

elif CONDITION#;then

   IF-TRUE#-STATEMENT

else

   OTHER-STATEMENT

fi



注意:如果没有else语句,而所有条件又都不满足,则不会执行任何一条语句。

即使有多个条件可能同时满足,但只会执行最先匹配到的那个条件的语句



示例1:通过脚本参数传递一个文件路径给脚本,判断此文件的类型;

[root@localhost ~]# cat type.sh 

#!/bin/bash

if [ $# -lt 1 ];then

echo "at least a arg"

fi


if ! [ -e $1 ];then

echo "no such file"

fi


if [ -b $1 ];then

echo "binary file"

elif [ -d $1 ];then

echo "directory file"

else

echo "other file"

fi

[root@localhost ~]# 


注意:case语句是简化版的多分支if语句,但不是每个多分支if语句都可以写成case语句。

    if语句可以嵌套。

示例二:编写一个脚本,实现如下功能:

  传递一个参数给脚本,此参数为用户名;根据其ID号来判断用户类型。

[root@localhost ~]# cat id_usertype.sh 

#!/bin/bash

if [ $# -lt 1 ];then

echo "at least a arg:"

fi


if ! id $1 &>/dev/null;then 

echo "the user $1 is not exits,please check it"

fi


user_id=$(id -u $1)

if [ $user_id -eq 0 ];then 

echo "user:$1 is root"

elif [ $user_id -lt 999 ];then

echo "user:$1 is system user"

else

echo "user:$1 is logon user"

fi

[root@localhost ~]# 

示例三:写一个脚本,实现如下功能:

1、列出如下菜单给用户

    disk)show disk info

    mem)show memory info

    cpu)show cpu info

    *) quit

2、提示用户给出自己的选择,然后显示对应的相应系统信息:

[root@localhost ~]# cat choice.sh 

#!/bin/bash

echo "disk)show disk info"

echo "mem)show memory info"

echo "cpu)show cpu info"

echo "*) quit"

read -p "your choice: " menu

if [[ "$menu" == "disk" ]];then 

 fdisk -l /dev/s[hd][a-z]

elif [[ "$menu" == "mem" ]];then

free -m

elif [[ "$menu" == "cpu" ]];then

lscpu

else 

echo "quit"

fi

[root@localhost ~]# 

示例三:写一个脚本,实现如下功能:

1、列出如下菜单给用户

    disk)show disk info

    mem)show memory info

    cpu)show cpu info

    *) quit

2、提示用户给出自己的选择,然后显示对应的相应系统信息:

[root@localhost ~]# cat choice.sh 

#!/bin/bash

cat <<EOF

 "disk)show disk info"

 "mem)show memory info"

 "cpu)show cpu info"

 "*) quit"

EOF


read -p "your choice: " menu

if [[ "$menu" == "disk" ]];then 

fdisk -l /dev/s[hd][a-z]

elif [[ "$menu" == "mem" ]];then

free -m

elif [[ "$menu" == "cpu" ]];then

lscpu

else 

echo "quit"

fi

[root@localhost ~]# 





3、linux脚本语句之循环执行:

循环执行:将一段代码重复执行多次(零次、一次、多次)


循环执行语句的条件:

    进入执行:只有满足条件时才进入循环

    退出条件:每个循环都应有退出条件,否则会出现死循环,


3.1、linux中bash脚本的循环语句分类:

    ①、for循环

        遍历列表

        控制变量  

    ②、while循环

    ③、until循环

   

3.2、for循环的格式:

    ①、遍历列表

    ②、控制变量


3.3、for循环之遍历列表

格式1:

    for VARIBLE in LIST;do

        STATEMENT

    done

解释: for 变量 in 遍历列表;do

        循环体语句

    done

格式2:(和if语句相似)

    for VARIBLE in LIST

    do

        STATEMENT

    done


注意:do要单独成行

示例:1

[root@localhost ~]# cat list.sh 

#!/bin/bash

for username in linux1 linux2 linux3;do

useradd $username

done

[root@localhost ~]# 


解释:先将linux1赋值给username,执行一遍循环体,遇到done结束;再将linux2赋值给username,执行一遍循环体,遇到done结束,最后将linux3赋值给变量username,在执行一遍循环体。



示例2:

[root@localhost ~]# cat list.sh 

#!/bin/bash

for username in linux1 linux2 linux3;do

if id $username&>/dev/null;then

echo "the user:$username is exists"

else

useradd $username &> /dev/null && echo "the user:$username is added"

fi

done

[root@localhost ~]# 


示例:3

创建10个文件:

[root@localhost ~]# cat  mf.sh

#!/bin/bash

for filename in 1 2 3 4 5 6 7 8 9 10 ;do

touch file$filename

done

[root@localhost ~]# 



    

注意:如示例2中,如果需要遍历列表的数量很多,怎么能快速生成这些遍历列表呢。


3.4、遍历列表[LIST]的生成方法有如下几种:    

    ①、直接给出:如示例1、2、3

    ②、整数列表

        (a)内建功能:花括号展开,格式:{start..end}  //注意此处是两个点好(.

            如:{1..10} :表示1 2 3 4 5 6 7 8 9 10

        (b)seq [start [increment]] last        //注意此处seq是命令,使用时需调用命令执行结果;#man seq查看帮助

            seq [option]... last :如seq 10  //表示列表1 2 3 4 5 6 7 8 9 10

            seq [option]... first last :如seq 5 10 //表示列表 5 6 7 8 9 10

            seq [option]... first increment last :first代表开始,increment代表步长,last代表结束。如seq 2 2 10,表示2 4 6 8 10

                [root@localhost ~]# seq 5 10

                5

                6

                     7

                     8

                     9

                     10

                     [root@localhost ~]# seq 2 2 10

                     2

                     4

                     6

                     8

                     10       

    ③、返回列表的命令:如:ls、cat等

    ④、golb

    ⑤、变量引用

        $@,$*    //$@表示所有参数,把所有参数当做一个字符串来看待;$*也表示所有参数,把所有参数当做一个个单独的字符串来看待。


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

[root@localhost ~]# cat  sum_100.sh 

#!/bin/bash

declare -x sum=0

for i in {1..100};do        //通过内建功能{}实现遍历

echo "\$sum is $sum"

echo "\$i is $i"

sum=$[ $sum+$i ]

done

echo "sum is $sum"

[root@localhost ~]# 


示例5、

    判断/var/log目录下的每个文件的类型;(可以通过file /var/log来查看,此处做练习for)

[root@localhost ~]# cat  glob.sh

#!/bin/bash

for file in /var/log/*;do        //glob格式的遍历列表

if [ -f file ];then

echo "$file is putongwenjian"

elif [ -d $file ];then

echo "$file is diretory file"

elif [ -c $file ];then

echo "$file is character file"

elif [ -p $file ];then

echo  "$file is pipe file"

elif [ -b $file ];then

echo "$file is block file"

elif [ -L $file ];then

echo "$file is link file"

elif [ -S $file ];then

echo "$file is socket file"

else 

echo "no type file"

fi

done

[root@localhost ~]# 


练习:用脚本实现如下功能

1、分别求100以内的所有偶数之和,及所有奇数之和。

2、计算当前系统上的所有用户的id之和

3、通过脚本参数传递一个目录给脚本,而后计算此目录下所有文件的行数之和;并说明此类文件的总数。