-le: 小于

-gt:大于


if  语句

多分支

if  判断条件 1 ; then

条件为真的分支代码

elif  判断条件 2 ; then

条件为真的分支代码

elif  判断条件 3 ; then

条件为真的分支代码

else

以上条件都为假的分支代码

fi

逐条件进行判断,第一次遇为"真"条件时,执行其分支,

而后结束整个if 语句

6

If 示例

根据命令的退出状态来执行命令


脚本_脚本


条件判断: case语句

case支持glob风格的通配符:

  *:任意长度任意字符

  ?:任意单个字符

   []:指定范围内的任意单个字符  

  a|b: a或b


条件判断:case 语句

case 变量引用 in

PAT1)

分支1

;;

PAT2)

分支2

;;

...

*)

默认分支

;;

esac


例子

问题:

脚本_脚本_02

答案

脚本_脚本_03


一般开头不用echo写,用cat重定向,如下:

脚本_脚本_04


脚本_脚本_05

Yesorno脚本,以后在工作中可以当模板使用

脚本_脚本_06


脚本_脚本_07

循环

循环执行

将某代码段重复运行多次

重复运行多少次:

循环次数事先已知

循环次数事先未知

有进入条件和退出条件

for, while, until


for 循环

for  变量名 in  列表;do

循环体

done

执行 机制 :

依次将列表中的元素赋值给"变量名";  每次赋值后即执

行一次循环体;  直到列表中的元素耗尽,循环 结束


for循环

For  + 变量名

In  + 列表 ;do

     循环内容

Done

脚本_脚本_08

命令在for里调用,要用反向单引号 :例如:`seq 10`

$*:所有

$@:个体

例子:

脚本_脚本_09


脚本_脚本_10

for的简单格式例子

脚本_脚本_11


脚本_脚本_12


Ping  ip地址  ping通为up,ping不通为down

脚本_脚本_13


并行执行,可以提高效率

脚本_脚本_14

执行脚本时,两种方法

脚本_脚本_15

颜色代码设置(在颜色号码前加1,可以提亮颜色)

脚本_脚本_16

RANDOM%7:表示0-6 ,一共7个数,后+31 表示31+0 ~31+6的范围

脚本_脚本_17


设置 一个横六竖八,的矩形,加颜色

脚本_脚本_18


脚本_脚本_19


脚本_脚本_20


编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态     unset:设置变量

脚本_脚本_21


三角形

脚本_脚本_22

while 循环

While 判断 ;do

操作

done


for循环更通用,for一般用于数字循环

while CONDITION; do

循环体

done

CONDITION :循环控制条件;进入循环之前,先做一次判

断;每一次循环之后会再次做判断;

条件为“true” ,则执行

一次循环;直到条件测试状态为“false” 终止循环

v  因此:CONDTION一般应该有循环控制变量;而此变量的值

会在循环体不断地被修正

v  进入条件:CONDITION为true

v  退出条件:CONDITIO

脚本_脚本_23

编写脚本,实现打印国际象棋棋盘

脚本_脚本_24

脚本_脚本_25

脚本_脚本_26

脚本_脚本_27

穿插一些bash用法:

bash 的文件测试

-a 判断文件存在则为真                   -e 同-a

-b 判断文件为块设备文件则为真(/dev/sda)

-c 判断文件为字符文件则为真(dev/tty1)

-d 判断文件为目录文件则为真

-f 判断文件为普通文件则为真

-h 判断文件为软链接文件则为真     -L 同-h   ( ln [-s] 源文件 链接文件    设置硬 [软] 链接 )

        -ef 判断文件为硬链接文件则为真 [ /app/a -ef /app/c ]

-p 是否存在且为命名管道文件

-S 是否存在且为套接字文件

脚本_脚本_28


判断

If case

If 判断 ;then

操作

Elif 判断;then

Else

操作

Fi

 

生成列表范围表示方法:

脚本_脚本_29

脚本_脚本_30


打印等腰三角形


脚本_脚本_31


Case $name in

判断)

操作

;;

 

判断)

操作

;;

*)

操作

;;

Esac

例子

脚本_脚本_32

循环

For while

For name in 范围 ;do

操作

Done

例子:

添加10 个用户user1-user10,密码为8 位随机字符

脚本_脚本_33

打印九九乘法表


脚本_脚本_34


for的第二种用法:

 

可以进行数据运算

脚本_脚本_35

第一个命令执行完后,接着去判断第二个条件是否成立,去执行exp2,如果为真,则去执行命令循环体commands,命令执行结束后,继续执行exp3,执行完毕后,反过头接着去检查exp2,exp2为真则去执行后续的循环,为假,则整个循环结束

 

 

 for 循环的特殊格式:

for (( 控制变量初始化; 条件判断表达式;控制变量的修正表达

式式))

do

循环体

done

脚本_脚本_36

 for ((i=1;sum=0;i<=100;i++));    

  i=1 ,sum=0相当于exp1;  i<=100,相当于exp2;  i++,相当于exp3;

do下面的操作相当于COMMANDS

i=1,sum=0,然后判断i<=100,如果为真的话,就做commands里面的操作,然后i++

如果为假的话,就退出循环

脚本_脚本_37

 

until 循环

v until CONDITION; do

循环体

v done

v: 进入条件: CONDITION 为false

v: 退出条件: CONDITION 为true

 

Pgrep  -au hacker:显示用户的进程路径 ;通过这个检测,查看用户是否登陆,然后进行下边的操作进行杀死、踢出。

检测hacker是否登陆,如果没有,则休眠0.5秒,如果发现登陆,则杀掉、踢出,退出循环

脚本_脚本_38


杀死用户进程

Pkill  -9  -u  nameuser:杀死、踢出用户

脚本_脚本_39

*******************************************************************

小知识点:

生成随机数:   cat  /dev/urandom

 

修改用户的密码为“”,常用于脚本

echo "PASSWORD" | passwd --stdin USERNAME 

 

\>: 词尾锚定

\<:词前锚定

 

*******************************************************************

脚本_脚本_40

脚本_脚本_41脚本_脚本_42

循环控制语句continue

v  用于循环体中

v continue [N] :提前结束第N 层的本轮循环,而直接进入下一

轮判断;最内层为第1层 层

continue:结束当次循环,开始下一轮循环)

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

done

 

continue:结束当次循环,开始下一轮循环)在下面题中的意思是当i=51时,则不执行循环,开始下一轮循环

脚本_脚本_43

脚本_脚本_44

循环控制语句break

v  用于循环体中

v break [N] :提前结束第N 层循环, 最内层为第1层 层

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

break

fi

CMDn

...

 done

 

break结束整个循环,在下面的题中,意思是指当i=51时,结束整个循环

脚本_脚本_45

While :  :意思是一直循环

脚本_脚本_46

脚本_脚本_47

循环控制shift 命令

每次将参数列表整体向左移动,原来的第一个参数没有了,第二个参数成为第一个,shift=2,意思是将向左移动2

v shift [n ]

v表 用于将参量列表 list  左移指定次数,缺省为左移一次。

v表 参量列表 list  一旦被移动,最左端的那个参数就从列表中删

除。while 到 循环遍历位置参量列表时,常用到 shift

v ./doit.sh a b c d e f gh

v ./shfit.sh a b c d e f gh

 

$#:显示的总个数

$#0时,输出使用方法arg1..;并退出

当输入的数字的总数不为空且大于0时,则添加参数$1,然后向左移动一位,继续添加数字,循环。。

脚本_脚本_48

bash shift.sh a b c d  :创建  a b c d

 getent passwd:查看是否创建成功

脚本_脚本_49


脚本_脚本_50

select 循环与菜单

经常做菜单用,经常配合case判断结合用

vselect variable in list

do

循环体命令

done

vselect  循环主要用于创建菜单,按数字顺序排列的

菜单项将显示在标准错误上,并显示 PS3  提示符,

等待用户输入

v  用户输入菜单列表中的某个数字,执行相应的命令

v量 用户输入被保存在内置变量 REPLY 中 中

26

select case

vselect 用 是个无限循环,因此要记住用 break  命令退

出循环,或用 exit 按 命令终止脚本。也可以按 ctrl+c

退出循环

vselect 和 经常和 case  联合使用

v for 略 循环类似,可以省略 in list, , 此时使用位置

参量

Select  name in  菜单项

脚本_脚本_51

脚本_脚本_52

:.,$s/^/# :给脚本内容全部加上#注释

上图添加注释后效果

脚本_脚本_53

select循环做的菜单,如下图结果

脚本_脚本_54

PS1:修改命令提示符          [root@localhost ~]

使提示符变红色:

脚本_脚本_55

脚本_脚本_56

脚本_脚本_57

脚本_脚本_58


     提示符

 

信号捕捉trap

v trap ' 触发指令信号

自定义进程收到系统发出的指定信号后,将执行触发指令

,而不会执行原操作

捕捉ctrl+c ,只是打印出来,而不会执行ctrl+c的原操作

脚本_脚本_59

v trap ' '  信号

忽略信号的操作  (在执行过程中,按ctrl+c没有任何作用,直接忽略此选项)

脚本_脚本_60

v trap '-'  信号

恢复原信号的操作

脚本_脚本_61

v trap -p

列出自定义信号操作

脚本_脚本_62

脚本_脚本_63

脚本_脚本_64

2、常用信号:

1) SIGHUP:  无须关闭进程而让其重读配置文件

2) SIGINT:  中止正在运行的进程;相当于Ctrl+c

3) SIGQUIT: 相当于ctrl+\

9) SIGKILL:  强制杀死正在运行的进程

15) SIGTERM :终止正在运行的进程(默认为15)

18) SIGCONT :继续运行

19) SIGSTOP :后台休眠

信号,强制杀死,捕获不

 

函数

一段代码的集合,集合后起个名字,下次直接调用名字,

判断版本号

脚本_脚本_65


将上述代码写成脚本,并赋值,这样别的脚本直接$?,可以直接调用这个脚本

脚本_脚本_66

下图是直接调用上图中的版本脚本代码,$?:意思是引用上一条脚本

下图中是直接调用上述脚本赋予的值,执行效果图

脚本_脚本_67

定义函数

  函数由两部分组成:函数名和函数

v help function

v  语法一:

f_name  (){

... 函数体...

}

定义函数func1 ;执行后可以显示出来定义的内容,在学脚本时,可以将复杂的脚本定义为一个简单的函数值,执行脚本时直接执行此函数值就可以了


脚本_脚本_68

脚本_脚本_69

eclare:  查询   -f: 函数

  declare-f +函数名:  查询想要查找的函数

脚本_脚本_70

常量:不更改的变量,只能读,不能改

 

Source   和 .:强制执行的意思,不管在哪一层

 

v  在函数中定义局部变量的方法

local NAME=VALUE

添加local 后,name变量函数的值只对定义函数内部有效,外边的name不受影响,如下图:

脚本_脚本_71

函数体内部一般不加exit,相当于退出脚本

脚本_脚本_72

exit:返回一个变量

 

 

调用函数命令显示成功失败 ,平时写脚本时可以直接使用       

action:函数

  action  +想显示的字符串   后如果是true,则打印ok

  action +想显示的字符串     后如果是false,则打印failed

 

脚本_脚本_73

删除成功的前提是,有此用户

脚本_脚本_74

定义函数,如果担心与普通命令冲突,在其前面+f_;例如:f_ls

脚本_脚本_75

脚本里边不可以直接用别名,可以用函数

脚本_脚本_76

declare -f:函数

 declare-xf :环境函数 ,可以子进程调用

  ls -d */: 只显示文件夹