
一. 基础知识部分:
· 变量知识概念
1)常规变量:
临时定义方式: 在脚本中或命令行中设置 oldboy=123
永久定义方式: 在特殊系统变量文件中设置 /etc/profile /etc/bashrc ~/.bashrc ~/.bash_profile
设置变量:
① 进行字符串设置 name="oldboy" name=”123456" name="oldboy edu python"
② 进行变量调用 info="python" name="$info"
③ 进行命令信息设置 IP_info="$(hostname -i)" IP_info=`hostname -i`
2)环境变量:
export INFO="XXXX"
有export定义变量:对当前登录窗口所有shell都生效
无export定义变量:只对当前shell生效
变量赋值方式:
① 直接赋值: a=1 b=2 echo $a $b
service 启动或重启或停止服务
② 传参赋值: a=$1 b=$2 ./test.sh oldboy oldgirl ./test.sh "oldboy oldgirl" oldman
③ 交互赋值: 需要交互询问信息进行赋值
read -p "请输入学员姓名: " name age
echo $name >> class.txt
echo $age >> class.txt
3) 特殊变量
$0: 用于获取脚本名称信息,直接显示脚本名称和路径信息
echo "$0脚本执行失败,请检查脚本逻辑"
$#:统计出脚本的传入参数总数
$*:输出脚本所有参数信息
$@:输出脚本所有参数信息
$?:输出命令执行返回值 利用返回值可以判断命令是否执行成功
0 表示操作执行成功
非0 表示操作执行失败
$$ 获取一个脚本执行PID信息
$! 获取上一个程序或脚本后台运行pid信息
sh test.sh & --- 让脚本后台运行
$_ 获取脚本的最后一个参数信息
sh test.sh a b c
echo $_
c
· 脚本执行方法
① 直接授权脚本执行权限,直接运行脚本
./test.sh /root/test.sh
② 利用命令信息执行脚本
sh ./test.sh bash ./test.sh --- 利用命令解释器执行脚本
source ./test.sh --- 脚本之间信息加载调用
· 系统正则知识
基础正则符号:^ $ ^$ . * .* [] [^]
^ : 可以匹配以指定信息开头内容
$ : 可以匹配以指定信息结尾内容
^$: 可以匹配空行信息
grep -vE "^$|^#" test.txt --- 排除注释信息和空行信息
. : 匹配任意且只有一个字符信息
* : 匹配任意一个字符连续出现0次或多次情况
.*: 匹配任意所有字符信息
: 转义符号信息 (将有意义信息变得没有意义 将没有意义的信息变得有意义)
[]: 批量取出多个字符信息 大写字母 A B
[^]: 排除指定多个字符信息 进行过滤
grep 过滤 sed 编辑 awk 分析 --- 直接加载基础正则
扩展正则符号:+ | {} () ?
grep -E 过滤 sed -r 编辑 awk 分析
+ : 匹配任意一个字符连续出现1次或多次情况
| : 可以匹配多个信息,多个信息之间是或者关系
{} : 可以指定连续匹配的次数信息
{n} 正好连续n次
{n,} 最少连续出现n次,超过n次默认匹配
{,n} 最多连续出现n次,少于n次默认匹配‘
{n.m} 最少连续出现n次,最多匹配连续出现m次
(): 将多个字符信息当成一个整体进行匹配
? : 匹配任意一个字符连续出现0次或1次情况
man grep/sed/awk
二.进阶知识部分
· 脚本算法知识
① $(()) --- 实现数值信息运算(只支持整数运算)
echo $((1+2))
② 自增自减运算
自减运算:$((a--))
[root@web01 ~]# a=10
[root@web01 ~]# echo $((a--))
10
[root@web01 ~]# echo $((a--))
9
[root@web01 ~]# echo $((a--))
8
[root@web01 ~]# echo $((a--))
7
[root@web01 ~]# a=10
[root@web01 ~]# echo $((--a))
9
自增运算:$((a++))
[root@web01 ~]# a=10
[root@web01 ~]# echo $((a++))
10
[root@web01 ~]# echo $((a++))
11
[root@web01 ~]# echo $((a++))
12
[root@web01 ~]# echo $((a++))
13
[root@web01 ~]# echo $((a++))
[root@web01 ~]# a=10
[root@web01 ~]# echo $((++a))
11
③ let --- 实现数值信息运算 (只支持整数运算)
[root@web01 ~]# i=2
[root@web01 ~]# let i=i+8
[root@web01 ~]# echo $i
10
④ expr --- 实现数值信息运算 (只支持整数运算)
[root@web01 ~]# expr 1 + 1
2
[root@web01 ~]# expr 2-1
2-1
[root@web01 ~]# expr 2 - 1
1
[root@web01 ~]# i=1
[root@web01 ~]# expr $i - 1
0
④ bc --- 实现数值信息运算 但是只是整数和小数
[root@web01 ~]# echo 3+5|bc
8
您在 /var/spool/mail/root 中有邮件
[root@web01 ~]# echo 3.3+5.3|bc
8.6
[root@web01 ~]# echo 3.3679+5.30987|bc
8.67777
· 脚本信息比较
数值信息比较:
eg:记录学员信息,如果学员年龄信息大于30岁,不能进行录取
# cat test.sh
#!/bin/bash
read -p "请问你的年龄多少:" age
if [ $age -gt 30 ]
then
echo 不能进行录取
else
echo 欢迎加入
fi
-lt 表示小于
-gt 表示大于
-eq 表示等于
-ne 表示不等于
-le 表示小于等于
-ge 表示大于等于
字符信息比较:
eg:验证员工口令,口令通过可以进入公司
#!/bin/bash
read -p "请说出口令信息:" age
if [ "$age" == "天王盖地虎" ]
then
echo 欢迎
else
echo 有入侵
fi
== 表示字符串信息匹配成功
!= 表示字符串信息匹配失败
· 判断语句说明
if判断语句:
1)单分支判断语句
如何... 就 ...
if [ 好看 ]
then
和他/她在一起
fi
2)双分支判断语句
如何... 就 ... 否则 ...
if [ 好看 ]
then
和他/她在一起
else
培养培养
fi
3)多分支判断语句
如何 首选条件成立 就... 次选条件成立 就... 再次选条件成立 就... 否则 ....
if [ 好看 ]
then
和他/她在一起
elif [ 身材好 ]
then
和他/她在一起
elif [ 家境好 ]
then
和他/她在一起
else
先单身
fi
eg01:输入两个数字 判断两个数字是否是整数
#!/bin/bash
read -p "请输入第一个数字: " num1
read -p "请输入第二个数字: " num2
if [ -z "$num1" ]
then
echo "输入的第一个数字为空,请重新输入"
exit
elif [ -z "$num2" ]
then
echo "输入的第二个数字为空,请重新输入"
exit
elif [[ "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]]
then
echo "输入内容均为整数"
else
echo "输入内容非整数信息"
exit
fi
eg02:判断当前网络地址中,有哪些地址是已使用地址,有哪些地址是未使用地址?
10.0.0.0/24 10.0.0.1 ~ 10.0.0.254
ping -c 3 -W 3
#!/bin/bash
for ip in 10.0.0.{1..254} 10.0.0.2
do
{ ping -c 3 -W 3 $ip &>/dev/null
if [ $? -eq 0 ]
then
echo $ip is online
else
echo $ip is offline
fi } &
done
eg03: 猜商品价格(1-100) 已知鼠标=50 随机
如何生成随机数字:
方法一:通过random变量产生随机数
echo $RANDOM 0-32768
方法二:通过openssl命令产生随机数
openssl rand -base64 10
方法三:通过时间信息获取随机数
date +%S%N
方法四:利用UUID文件生成随机数
cat /proc/sys/kernel/random/uuid
#!/bin/bash
num=`echo $((RANDOM%100+1))`
echo $num >/tmp/oldboy.txt
while true
do
let i++
read -p "请输入一个数字[1-100]: " info
if [ $info -gt $num ]
then
echo "你输入的数字大了"
elif [ $info -lt $num ]
then
echo "你输入的数字小了"
else
echo "恭喜你猜对了 总共猜了 $i 次"
exit
fi
done
case判断语句: 流程控制语句 == 多分支语句
语句格式:
case 变量名 in
模拟匹配1)
模式1匹配处理
;;
模拟匹配2)
模式2匹配处理
;;
模拟匹配3)
模式2匹配处理
;;
*)
其他匹配处理
esac
eg01:根据学习课程显示报价:
#!/bin/bash
echo -e "老男孩课程说明npython课程nlinux课程n网络安全"
read -p "请选择要学习课程,可以提供价格参考:" name
case $name in
python|PYTHON)
echo python 课程 20000 元
;;
linux|LINUX)
echo linux 课程 15000 元
;;
网络安全)
echo 网络安全课程 10000 元
;;
*)
echo 您输入课程参数无法提供
esac
eg02:菜单功能进行自动化管理
#!/bin/bash
meun() {
cat <<EOF
1. 显示系统负载信息
2. 显示系统磁盘信息
3. 显示系统内存信息
4. 显示系统登录用户
EOF
}
while true
do
read -p "请输入想要查看的系统信息编号:" num
case $num in
1)
uptime
;;
2)
df -h
;;
3)
free -h
;;
4)
w
;;
*)
echo 请输出选项编号
esac
done
· 循环语句说明 for while until
for循环:有限循环
for 变量名称 in 循环范围 {1..10} / oldboy oldgirl oldman / `cat user_list.txt`
do
循环操作命令
done
#!/bin/bash
for user in oldman{01..03}
do
useradd $user
done
while循环:无限循环(守护进程)
当设置为有限循环时,只有条件不满足时,循环结束
while 条件=true 循环就会一直执行
while 条件=false 循环就会立刻终止
无限循环:
while true
do
每次循环做的操作
done
有限循环:
while [ 条件表达式 ]
do
每次循环做的操作
done
until循环:无限循环(守护进程)
当设置为有限循环时,只有条件满足时,循环结束
until 条件=true 循环就会立刻终止
until 条件=false 循环就会一直执行
无限循环:
until false
do
每次循环做的操作
done
有限循环:
while [ 条件表达式 ]
do
每次循环做的操作
done
三.高级知识部分
· 脚本函数概念
概念:命令的集合 完成特定功能代码块 代码块可以实现复用
函数名称() {
[ $# -ne 2 ] && echo 输入两个参数
}
函数定义方法:
三种方式定义
test1() {
echo '定义第一个函数'
}
funcation test2() {
echo '定义第二个函数'
}
funcation test3 {
echo '定义第二个函数'
}
test1
test2
test3
· 脚本数组概念
将大量不同元素进行整合汇总,汇总信息称为数组
array[xx]=(oldboy oldgirl oldman)
设置一个数组
array=(oldboy oldgirl oldman)
调用数组中指定元素值
echo ${array[0]}
调用所有数组中元素信息
eg:给班级学员进行学号设置:
#!/bin/bash
array=(
oldboy
oldgirl
oldman
alex
yuanhao
)
for ((i=0;i<${#array[*]};i++))
do
echo "我是第$i学号学员,我的姓名是${array[$i]},请多关照"
done