加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 09:12:08 所属栏目:安全 来源:网络整理
导读:1、过程式编程语句的执行流程: 顺序执行:从上至下一次执行 选择执行: 逻辑关系:、||、! if语句 单分支if语句 双分支if语句 多分支if语句 case语句 循环执行: 2、if语句格式: 2.1、单分支if语句语法: if CONDITION ;then IF-TRUE-STATEMENT fi 或: i

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读