您的位置:首页 > 运维架构 > Shell

10、bash脚本编程之程序语句选择执行、循环执行

2017-12-05 21:41 791 查看
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-STATEMENTelse IF-FALSE-STATEMENTfi2.3、多分支if语句语法:if CONDITION1;then IF-TRUE1-STATEMENTelif CONDITION2;then
IF-TRUE2-STATEMENT
elif CONDITION3;then IF-TRUE3-STATEMENTelif CONDITION#;then IF-TRUE#-STATEMENTelse OTHER-STATEMENT
fi

注意:如果没有else语句,而所有条件又都不满足,则不会执行任何一条语句。即使有多个条件可能同时满足,但只会执行最先匹配到的那个条件的语句
示例1:通过脚本参数传递一个文件路径给脚本,判断此文件的类型;[root@localhost ~]# cat type.sh #!/bin/bashif [ $# -lt 1 ];thenecho "at least a arg"fi
if ! [ -e $1 ];thenecho "no such file"fi
if [ -b $1 ];thenecho "binary file"elif [ -d $1 ];thenecho "directory file"elseecho "other file"fi[root@localhost ~]#
注意:case语句是简化版的多分支if语句,但不是每个多分支if语句都可以写成case语句。 if语句可以嵌套。
示例二:编写一个脚本,实现如下功能: 传递一个参数给脚本,此参数为用户名;根据其ID号来判断用户类型。
[root@localhost ~]# cat id_usertype.sh #!/bin/bashif [ $# -lt 1 ];thenecho "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 ];thenecho "user:$1 is system user"elseecho "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/bashecho "disk)show disk info"echo "mem)show memory info"echo "cpu)show cpu info"echo "*) quit"read -p "your choice: " menuif [[ "$menu" == "disk" ]];then fdisk -l /dev/s[hd][a-z]elif [[ "$menu" == "mem" ]];thenfree -melif [[ "$menu" == "cpu" ]];thenlscpuelse 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/bashfor filename in 1 2 3 4 5 6 7 8 9 10 ;dotouch file$filenamedone[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、通过脚本参数传递一个目录给脚本,而后计算此目录下所有文件的行数之和;并说明此类文件的总数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bash if