-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


例子

问题:

答案


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


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


循环

循环执行

将某代码段重复运行多次

重复运行多少次:

循环次数事先已知

循环次数事先未知

有进入条件和退出条件

for, while, until


for 循环

for  变量名 in  列表;do

循环体

done

执行 机制 :

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

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


for循环

For  + 变量名

In  + 列表 ;do

     循环内容

Done

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

$*:所有

$@:个体

例子:


for的简单格式例子



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


并行执行,可以提高效率

执行脚本时,两种方法

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

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


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




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


三角形

while 循环

While 判断 ;do

操作

done


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

while CONDITION; do

循环体

done

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

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

条件为“true” ,则执行

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

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

会在循环体不断地被修正

v  进入条件:CONDITION为true

v  退出条件:CONDITIO

wKiom1m9FIGwrUh8AACXzPWHMw0751.png

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

wKioL1m9FNfDNioDAACnSgYqxAk127.png

wKioL1m9FQGgthpmAAB5gQxtQ2Y139.png

wKioL1m9FRWBdXphAAAbysXmfK4831.png

wKioL1m9FSzhgNKUAAEtUv4HrSw503.png

穿插一些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 是否存在且为套接字文件

wKioL1m9FYWzrqx3AAAujwUZMbY586.png


判断

If case

If 判断 ;then

操作

Elif 判断;then

Else

操作

Fi

 

生成列表范围表示方法:

wKiom1m9FluSBTGnAAAirH3Cmhg073.png

wKioL1m9Fj_wbfLFAAAzqFLo9nc570.png


打印等腰三角形


wKiom1m9Fn6zpFuuAAEuHz-5vpE203.png


Case $name in

判断)

操作

;;

 

判断)

操作

;;

*)

操作

;;

Esac

例子

wKiom1m9FxTyw66HAAAiquoAyh8547.png

循环

For while

For name in 范围 ;do

操作

Done

例子:

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

wKiom1m9F3TiFTKdAAAsH_Lsc7g830.png

打印九九乘法表


wKioL1m9F1bh2mJlAAEna91Hmg4414.png


for的第二种用法:

 

可以进行数据运算

wKiom1m9F_fif-G-AAAsDpmLdLY151.png

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

 

 

 for 循环的特殊格式:

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

式式))

do

循环体

done

wKioL1m9F_fwNX7ZAABG7ic0PVk759.png

 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++

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

wKiom1m9GEzBj3BSAABsC_ZtaRs319.png

 

until 循环

v until CONDITION; do

循环体

v done

v: 进入条件: CONDITION 为false

v: 退出条件: CONDITION 为true

 

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

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

wKiom1m9GI7xg6LxAABLuo2IvYg083.png


杀死用户进程

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

wKioL1m9GJLg9qZcAAFIbgg05pk335.png

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

小知识点:

生成随机数:   cat  /dev/urandom

 

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

echo "PASSWORD" | passwd --stdin USERNAME 

 

\>: 词尾锚定

\<:词前锚定

 

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

wKioL1m9GPPCa71fAABc5k--9bI965.png

wKioL1m9GmnDlU3TAAFIbgg05pk675.pngwKioL1m9GnvwS4qsAABsC_ZtaRs807.png

循环控制语句continue

v  用于循环体中

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

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

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

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

done

 

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

wKiom1m9Gv3SaQQgAABjXRI4iZk772.png

wKiom1m9Gw6hUzUQAAC2oZslV9k237.png

循环控制语句break

v  用于循环体中

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

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

break

fi

CMDn

...

 done

 

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

wKioL1m9Gzri89U5AABVwkiWMbw614.png

While :  :意思是一直循环

wKiom1m9G7_BDjNlAAB1dGFmvSY852.png

wKioL1m9G6PirceeAABtbX34KGE559.png

循环控制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,然后向左移动一位,继续添加数字,循环。。

wKioL1m9G8yy0SfpAACCvHjxkfI337.png

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

 getent passwd:查看是否创建成功

wKiom1m9HDGiMChjAABXqvGCiic259.png


wKiom1m9HHuDwjDeAACm2xbNG40664.png

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  菜单项

wKioL1m9HIuxQHmhAAAuXFALNj8841.png

wKioL1m9HJmi_6j-AAB-JgmgenM938.png

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

上图添加注释后效果

wKioL1m9HK6y3BcDAACYCRIejPs027.png

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

wKiom1m9HReDmB7YAADkuDzqFY8140.png

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

使提示符变红色:

wKioL1m9HTDSDJ1XAAAlTcI8eKw609.png

wKiom1m9HZfjqnvrAAAZ_RzHdTg118.png

wKioL1m9HXuDylyRAAD-oihUj_Y376.png

wKioL1m9HYuhivZqAADRcYaN8E8774.png


     提示符

 

信号捕捉trap

v trap ' 触发指令'  信号

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

,而不会执行原操作

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

wKioL1m9HcnADLGGAABnfXQ3Gow816.png

v trap ' '  信号

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

wKiom1m9HiXyMRCyAAAL7dNuHK0480.png

v trap '-'  信号

恢复原信号的操作

wKioL1m9HiGRiDSzAAAOQWLcZU8195.png

v trap -p

列出自定义信号操作

wKioL1m9HkvR6eScAABNBHZA4DE819.png

wKioL1m9HoLQRM3jAACAoEU_vx4288.png

wKiom1m9HsOzdiadAAAqQGTjI7o742.png

2、常用信号:

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

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

3) SIGQUIT: 相当于ctrl+\

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

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

18) SIGCONT :继续运行

19) SIGSTOP :后台休眠

9 信号,强制杀死,捕获不

 

函数

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

判断版本号

wKioL1m9Hs7D1ZfkAABXDRJ0tb8780.png


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

wKiom1m9HyCiFUzvAABfD8hNgOU092.png

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

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

wKioL1m9HxrTdPMoAAC_5o1uYEA733.png

定义函数

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

v help function

v  语法一:

f_name  (){

... 函数体...

}

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


wKiom1m9H3vCc7TkAAA61BB0SHs523.png

wKioL1m9H2ySpQ-qAADLYxwerdQ398.png

eclare:  查询   -f: 函数

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

wKiom1m9H8bDY181AAB_uYdOG5U161.png

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

 

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

 

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

local NAME=VALUE

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

wKioL1m9H9Tx8_UWAABnvYhZe8w695.png

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

wKioL1m9H_7w_NizAACFAS3TjsQ962.png

exit:返回一个变量

 

 

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

action:函数

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

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

 

wKiom1m9IG3DwavVAADZtJoAn10051.png

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

wKioL1m9II3BXKddAACnphlXplM350.png

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

wKioL1m9ILbzZIljAAA1oJQL_JU687.png

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

wKiom1m9IQrwg-j7AABRwuxJJFk092.png

declare -f:函数

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

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