-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
编写脚本,实现打印国际象棋棋盘
穿插一些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 是否存在且为套接字文件
判断
If case
If 判断 ;then
操作
Elif 判断;then
…
Else
操作
Fi
生成列表范围表示方法:
打印等腰三角形
Case $name in
判断)
操作
;;
判断)
操作
;;
*)
操作
;;
Esac
例子
循环
For while
For name in 范围 ;do
操作
Done
例子:
添加10 个用户user1-user10,密码为8 位随机字符
打印九九乘法表
for的第二种用法:
可以进行数据运算
第一个命令执行完后,接着去判断第二个条件是否成立,去执行exp2,如果为真,则去执行命令循环体commands,命令执行结束后,继续执行exp3,执行完毕后,反过头接着去检查exp2,exp2为真则去执行后续的循环,为假,则整个循环结束
for 循环的特殊格式:
for (( 控制变量初始化; 条件判断表达式;控制变量的修正表达
式式))
do
循环体
done
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++
…
如果为假的话,就退出循环
until 循环
v until CONDITION; do
循环体
v done
v: 进入条件: CONDITION 为false
v: 退出条件: CONDITION 为true
Pgrep -au hacker:显示用户的进程路径 ;通过这个检测,查看用户是否登陆,然后进行下边的操作进行杀死、踢出。
检测hacker是否登陆,如果没有,则休眠0.5秒,如果发现登陆,则杀掉、踢出,退出循环
杀死用户进程
Pkill -9 -u nameuser:杀死、踢出用户
*******************************************************************
小知识点:
生成随机数: cat /dev/urandom
修改用户的密码为“”,常用于脚本
echo "PASSWORD" | passwd --stdin USERNAME
\>: 词尾锚定
\<:词前锚定
*******************************************************************
循环控制语句continue
v 用于循环体中
v continue [N] :提前结束第N 层的本轮循环,而直接进入下一
轮判断;最内层为第1层 层
(continue:结束当次循环,开始下一轮循环)
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
(continue:结束当次循环,开始下一轮循环)在下面题中的意思是当i=51时,则不执行循环,开始下一轮循环
循环控制语句break
v 用于循环体中
v break [N] :提前结束第N 层循环, 最内层为第1层 层
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
break结束整个循环,在下面的题中,意思是指当i=51时,结束整个循环
While : :意思是一直循环
循环控制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,然后向左移动一位,继续添加数字,循环。。
bash shift.sh a b c d :创建 a b c d
getent passwd:查看是否创建成功
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 菜单项
:.,$s/^/# :给脚本内容全部加上#注释
上图添加注释后效果
用select循环做的菜单,如下图结果
PS1:修改命令提示符 [root@localhost ~]
使提示符变红色:
提示符
信号捕捉trap
v trap ' 触发指令' 信号
自定义进程收到系统发出的指定信号后,将执行触发指令
,而不会执行原操作
捕捉ctrl+c ,只是打印出来,而不会执行ctrl+c的原操作
v trap ' ' 信号
忽略信号的操作 (在执行过程中,按ctrl+c没有任何作用,直接忽略此选项)
v trap '-' 信号
恢复原信号的操作
v trap -p
列出自定义信号操作
2、常用信号:
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT: 相当于ctrl+\
9) SIGKILL: 强制杀死正在运行的进程
15) SIGTERM :终止正在运行的进程(默认为15)
18) SIGCONT :继续运行
19) SIGSTOP :后台休眠
9 信号,强制杀死,捕获不
函数
一段代码的集合,集合后起个名字,下次直接调用名字,
判断版本号
将上述代码写成脚本,并赋值,这样别的脚本直接$?,可以直接调用这个脚本
下图是直接调用上图中的版本脚本代码,$?:意思是引用上一条脚本
下图中是直接调用上述脚本赋予的值,执行效果图
定义函数
函数由两部分组成:函数名和函数体
v help function
v 语法一:
f_name (){
... 函数体...
}
定义函数func1 ;执行后可以显示出来定义的内容,在学脚本时,可以将复杂的脚本定义为一个简单的函数值,执行脚本时直接执行此函数值就可以了
eclare: 查询 -f: 函数
declare-f +函数名: 查询想要查找的函数
常量:不更改的变量,只能读,不能改
Source 和 .:强制执行的意思,不管在哪一层
v 在函数中定义局部变量的方法
local NAME=VALUE
添加local 后,name变量函数的值只对定义函数内部有效,外边的name不受影响,如下图:
函数体内部一般不加exit,相当于退出脚本
exit:返回一个变量
调用函数命令显示成功失败 ,平时写脚本时可以直接使用
action:函数
action +想显示的字符串 后如果是true,则打印ok
action +想显示的字符串 后如果是false,则打印failed
删除成功的前提是,有此用户
定义函数,如果担心与普通命令冲突,在其前面+f_;例如:f_ls
脚本里边不可以直接用别名,可以用函数
declare -f:函数
declare-xf :环境函数 ,可以子进程调用
ls -d */: 只显示文件夹