1、过程式编程语句的执行流程:
顺序执行:从上至下一次执行
选择执行:
逻辑关系:&&、||、!
if语句
单分支if语句
双分支if语句
多分支if语句
case语句
循环执行:
2、if语句格式:2.1、单分支if语句语法:
if CONDITION ;then
IF-TRUE-STATEMENT
fi
或:
if CONDITION
then
IF-TRUE-STATEMENT
fi2.2、双分支if语句语法:
if CONDITION;then
IF-TRUE-STATEMENT
else
IF-FALSE-STATEMENT
fi2.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 <
"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、通过脚本参数传递一个目录给脚本,而后计算此目录下所有文件的行数之和;并说明此类文件的总数。