Shell脚本基础
Shell是一种脚本语言,又是一种命令语言。通俗来讲shell脚本就是一系列命令的集合,可以在Unix/linux上面直接使用,来实现自动化运维。Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件。
*:监控linux系统环境的使用情况
*:数据的处理。eg:日志的切割、分析、统计等
*:与数据库的交互,对数据库进行增,删,改,查等操作
*:监控进程,自动化启停服务进程
*:完成一些重复性的工作。eg:创建100个新用户;到服务器集群配置某个文件等
shell解释器:是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行。shell脚本不一定得有解释器,但是我们在写shell脚本的时候最好还是带上shell解析器。常见的shell解析器有这几种。
#!/bin/bash(默认)
#!/bin/ksh
#!/bin/bsh
#!/bin/sh
shell脚本的三种执行方法:
方法1:添加执行权限 chmod +x shell.sh
./shell.sh
方法2:sh shell.sh 或者bash shell.sh
方法3:source shell.sh
如下图我写了一个名叫wulei.sh脚本,以第二种方式直接运行的,以第一种方式运行没有执行权限,添加权限后就可以运行了。
这个脚本当前组的所有者只有rw权限,没有x权限,给它赋予权限后就成了 -rwx r-x r-x
文件权限:-rw- r-- r--
目录权限:drw- r-- r--
分三列:每三个为一列,分别是所有者(owner),所属组(group),其他(others)
rwx 读r:4 写w:2 执行x:1
常见符号指令
$? #判断上一条命令执行的是否成功
$0 #返回脚本的文件名称
$1-$9 #返回对应的参数值
$* #返回所有的参数值是什么
$# #返回参数的个数和
新建脚本:vim wulei2.sh
#!/bin/bash
#by 吴磊 2019-3
echo "脚本名称:$0"
echo "第一个参数是:$1"
echo "第二个参数是:$2"
echo "一共有多少参数:$#"
echo "这些参数是什么:$*"
执行脚本
[root@wulei shell]# sh wulei2.sh we23 45er 23we 67ty
脚本名称:wulei2.sh
第一个参数是:we23
第二个参数是:45er
一共有多少参数:4
这些参数是什么:we23 45er 23we 67ty
[root@wulei shell]#
整数运算:
加:expr 12 + 6 expr $a + $b
echo $[12 + 6] echo $[a + b]
echo $((12 + 6)) echo $((a + b))
减:expr 12 - 6 expr $a - $b
echo $[12 - 6] echo $[a - b]
echo $((12 - 6)) echo $((a - b))
乘:expr 12 \* 6 expr $a \* $b
echo $[12 * 6] echo $[a * b]
echo $((12 * 6)) echo $((a * b))
除:expr 12 / 6 expr $a / $b
echo $((12 / 6)) echo $((a / b))
echo $[12 / 6] echo $[a / b]
求余:expr 12 % 6 expr $a % $b
echo $((12 % 6)) echo $((a % b))
echo $[12 % 6] echo $[a % b]
小数运算:
bc计算器可以进行小数运算(yum install bc -y)
scale可以指定保留多少位小数(对加减无效,对乘,除,求余有效)
echo "scale=2;(0.2+0.3)/1" | bc #计算出0.2+0.3的和并保留俩位小数,默认bc计算器会省略掉个位数的0
echo "scale=2;(1.2+1.3)/1" | bc #计算出1.2+1.3的和并保留俩位小数
> #会覆盖原有的内容
>> #不会覆盖原有的内容
; #执行多条命令
| #管道符
&& #前面的命令执行成功,后面的才可以执行
|| #前面的命令执行失败,后面的才可以执行
"" #会输出变量值
'' #输出本身
`` #输出命令结果 eg:a=`date`;echo $a
2>/dev/null #有错误信息则不打印
1>/dev/null #有正确信息则不打印
文件默认数据
[root@wulei shell]# cat wulei3.sh
第1行
第2行
【> 覆盖数据(覆盖原有的数据)】
[root@wulei shell]# cat >wulei3.sh
覆盖数据
^C
[root@wulei shell]# cat wulei3.sh
覆盖数据
【>> 追加数据(在文件末尾追加数据)】
[root@wulei shell]# cat >>wulei3.sh
后面追加数据
^C
[root@wulei shell]# cat wulei3.sh
覆盖数据
后面追加数据
【; 执行多个命令(先执行前面的命令,后执行后面的命令)】
[root@wulei shell]# cat wulei3.sh ; ll
覆盖数据
后面追加数据
total 12
-rw-r--r--. 1 root root 183 Mar 23 04:03 wulei2.sh
-rw-r--r--. 1 root root 32 Mar 23 10:24 wulei3.sh
-rwxr-xr-x. 1 root root 89 Mar 23 09:53 wulei.sh
[root@wulei shell]#
【| 管道符(先获取符号前面的操作,把数据通过grep传给满足后面命令)】
[root@wulei shell]# cat wulei3.sh | grep 数据
覆盖数据
后面追加数据
[root@wulei shell]# cat wulei3.sh | grep 追加
后面追加数据
[root@wulei shell]#
【&& 前面的命令执行成功,后面的才可以执行】
[root@wulei shell]# cat wulei3.sh && ll
覆盖数据
后面追加数据
total 12
-rw-r--r--. 1 root root 183 Mar 23 04:03 wulei2.sh
-rw-r--r--. 1 root root 32 Mar 23 10:24 wulei3.sh
-rwxr-xr-x. 1 root root 89 Mar 23 09:53 wulei.sh
[root@wulei shell]# cat wulei333.sh && ll
cat: wulei333.sh: No such file or directory
【|| 前面的命令执行失败,后面的才可以执行】
[root@wulei shell]# cat wulei3.sh || ll
覆盖数据
后面追加数据
[root@wulei shell]# cat wulei333.sh || ll
cat: wulei333.sh: No such file or directory
total 12
-rw-r--r--. 1 root root 183 Mar 23 04:03 wulei2.sh
-rw-r--r--. 1 root root 32 Mar 23 10:24 wulei3.sh
-rwxr-xr-x. 1 root root 89 Mar 23 09:53 wulei.sh
[root@wulei shell]#
【''和""的区别,前者输出文本后者输出变量】
[root@wulei shell]# cat wulei4.sh
#!/bin/bash
#by wulei test
echo "这是第一个变量:$1"
echo '这是第一个变量:$1'
echo "这是第二个变量:$2"
echo '这是第二个变量:$2'
[root@wulei shell]# sh wulei4.sh 007 348
这是第一个变量:007
这是第一个变量:$1
这是第二个变量:348
这是第二个变量:$2
【`` 里面的值就是变量值的本身】
[root@wulei shell]# a='date'
[root@wulei shell]# echo $a
date
[root@wulei shell]# a="date"
[root@wulei shell]# echo $a
date
[root@wulei shell]# a=`date`
[root@wulei shell]# echo $a
Sat Mar 23 11:02:40 EDT 2019
【2>/dev/null 有错误信息则不打印】
[root@wulei shell]# cat aaa.txt
cat: aaa.txt: No such file or directory
[root@wulei shell]# cat aaa.txt 2>/dev/null
[root@wulei shell]#
【1>/dev/null 有正确信息则不打印】
[root@wulei shell]# cat wulei.sh
#!/bin/bash
#《shell脚本案例》
#by wulei 2019/3/23
echo 'shell脚本案例编写'
[root@wulei shell]# cat wulei.sh 1>/dev/null
[root@wulei shell]#
文件(夹)或者路径:
-e 目标是否存在(exist)
-d 是否为路径(directory)
-f 是否为文件(file)
[ -e wulei2.sh ] && echo '存在' #存在文件则输出
[ -d /usr/local ] && echo 'yes' #url存在则输入
[ -e foer.sh ] || touch foer.sh #没有foer.sh这个文件,假如没有就创建出foer.sh文件
权限:
-r 是否有读取权限(read)
-w 是否有写入权限(write)
-x 是否有执行权限(excute)
[ -x 123.txt ] && echo '有执行权限' #该目标有x权限则输出
整数值比较(int型):
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于或者等于(greater or equal)
-le 小于或者等于(lesser or equal)
[ 9 -gt 8 ] && echo '大于'
小数值比较(浮点型):
[ `echo '1.2 > 1.1' | bc` -eq 1 ] && echo ‘大于’
*[]里面的表达式成立,则输出大于;前半截为一个表达式所以
要用``圈起来,比较的结果为true则返回1反之为0.
字符串比较:
= 相等
!= 不相等
[ 'kkkkk' != 'kk' ] && echo '不等于'
shell脚本输入之read命令及上色
语法:read -参数 (有多个参数时,-p必须放在最后面)
-p:给出提示符。默认不支持"\n"换行
-n:限制读取字符的个数,触发到临界值会自动执行
-t:给出等待的时间,超时会退出read
-s:隐藏输入的内容
-e:对特殊字符转译
【read脚本输出案例】
#!/bin/bash
# 最多输入3个字符,5秒后退出,隐藏输入的字符
read -n 3 -t 5 -s -p "请输入密码:" pass
# -e 解析特俗字符 (换行)
echo -e "\n"
echo "您输入的密码是: $pass"
【脚本上色案例】
语法;echo -e "\033[字背景颜色;字体颜色;特效字符串\033[关闭属性"
#字体色范围:30-37
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
#字背景颜色范围:40-47
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;30m 红底黑字 \033[0m"
echo -e "\033[42;34m 绿底蓝字 \033[0m"
echo -e "\033[43;34m 黄底蓝字 \033[0m"
echo -e "\033[44;30m 蓝底黑字 \033[0m"
echo -e "\033[45;30m 紫底黑字 \033[0m"
echo -e "\033[46;30m 天蓝底黑字 \033[0m"
echo -e "\033[47;34m 白底蓝字 \033[0m"
# 特效范围
echo -e "\033[0m 无任何特效 \033[0m"
echo -e "\033[1m 高亮度 \033[0m"
echo -e "\033[4m 下划线 \033[0m"
echo -e "\033[5m 闪烁 \033[0m"
【上色输出脚本案例】
#/bin/bash
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;30m 红底黑字 \033[0m"
echo -e "\033[1m 高亮度 \033[0m"
read -p "`echo -e "\033[4m 请输入账号: \033[0m"`" name
read -p "`echo -e "\033[47;34;5m 请输入密码: \033[0m"`" pwd
echo -e "\n" #换行
echo "您输入的账号:$name 密码:$pwd"
海量数据处理之grep、cut、awk、sed 命令
grep应用场景:通常对数据进行 行的提取
语法:grep [选项]...[内容]...[file]
-v #提取不包含指定内容所属行的结果
-n #显示行号
-w #精确匹配(整行匹配)
-i #忽略大小写(linux是有严格大小写区分的)
^ #匹配开头行首
-E #正则匹配
【案例】
【文本内容】
[root@VM_0_3_centos wulei]# cat test.txt
user1user1user1user1
User2user2user2user2
User3user3User2user2
【查看包含指定内容的行】
[root@VM_0_3_centos wulei]# grep 'user' test.txt
user1user1user1user1
User2user2user2user2
User3user3User2user2
【查看不包含指定内容的行,并输出行号】
[root@VM_0_3_centos wulei]# grep -v -n 'User' test.txt
1:user1user1user1user1
【忽略大小写,并输出行号】
[root@VM_0_3_centos wulei]# grep -in 'User' test.txt
1:user1user1user1user1
2:User2user2user2user2
3:User3user3User2user2
【匹配整行内容】
[root@VM_0_3_centos wulei]# grep -wn 'user1user1' test.txt
[root@VM_0_3_centos wulei]# grep -wn 'user1user1user1user1' test.txt
1:user1user1user1user1
【查看以user开头的行】
[root@VM_0_3_centos wulei]# grep -n '^user' test.txt
1:user1user1user1user1
【查看以user1或user2开头的行】
[root@VM_0_3_centos wulei]# grep -nE 'user1|user2' test.txt
1:user1user1user1user1
2:User2user2user2user2
3:User3user3User2user2
cut应用场景:通常对数据进行列的提取
语法:cut [选项]...[file]
-d #指定分割符
-f #指定截取区域
-c #以字符为单位进行分割
【案例】
【文本内容】
[root@VM_0_3_centos wulei]# cat wulei.sh
1001:1002:1003:1004
2001a a2002a2003a2004
3001:3002:3003:3004
4001b4002b4003b4004
【以:分割,截取第1列和第3列】
[root@VM_0_3_centos wulei]# cut -d ':' -f 1,3 wulei.sh
1001:1003
2001a a2002a2003a2004
3001:3003
4001b4002b4003b4004
【以b分割,截取第一列和第三列】
[root@VM_0_3_centos wulei]# cut -d 'b' -f 1,3 wulei.sh
1001:1002:1003:1004
2001a a2002a2003a2004
3001:3002:3003:3004
4001b4003
【以b分割,截取第二列到最后一列】
[root@VM_0_3_centos wulei]# cut -d 'b' -f 2- wulei.sh
1001:1002:1003:1004
2001a a2002a2003a2004
3001:3002:3003:3004
4002b4003b4004
【截取每列第5~10个字符】
[root@VM_0_3_centos wulei]# cut -c 5-10 wulei.sh
:1002:
a a200
:3002:
b4002b
【截取每列第5到最后一个字符】
[root@VM_0_3_centos wulei]# cut -c 5- wulei.sh
:1002:1003:1004
a a2002a2003a2004
:3002:3003:3004
b4002b4003b4004
awk的应用场景:通常对数据进行列的提取 语法: awk '条件 {执行动作}'文件名 awk '条件1 {执行动作} 条件2 {执行动作} ...' 文件名 或awk [选项] '条件1 {执行动作} 条件2 {执行动作} ...' 文件名 特殊要点与举例说明: print #打印出内容,默认会自动换行 printf #格式化输出,不会自动换行。 ( %s: 表示一个字符串 %ns:字符串型,n代表有多少个字符; %ni:整型,n代表输出几个数字; %.nf:浮点型,n代表的是小数点后有多少个小数 \t #制表符(tab键) \n #换行符 $1 #代表第一列 $2 #代表第二列 $0 #代表一整行 -F #指定分隔符 BEGIN #在读取所有行内容前就开始执行,常常被用于修改内置变量的值 FS #BEGIN时定义分割符 END #结束的时候 执行 NR #指定行号 ) 【案例】 [root@VM_0_3_centos ~]# printf '%s\n%s %s' we er er er 【\n 换行 \字符串类型】 we er erer [root@VM_0_3_centos ~]# printf '%s%s %s %s%s' 1 2w3 45r 56t 6765 12w3 45r 56t6765[root@VM_0_3_centos ~]# printf '%s\n%s %s ' we er er er erer we er er er erer [root@VM_0_3_centos ~]# printf '%s\n%s\t%s' we er er 【\t隔开】 we er er[root@VM_0_3_centos ~]# printf '%i \t %i %i' we er er【\i int类型,这里是字符所以报错】 -bash: printf: we: invalid number -bash: printf: er: invalid number -bash: printf: er: invalid number 0 0 0[root@VM_0_3_centos ~]# printf '%i \t %i %i' 12 34 56【\i 输出数字】 12 34 56 【检查系统磁盘空间占用情况】 [root@VM_0_3_centos ~]# df -m Filesystem 1M-blocks Used Available Use% Mounted on /dev/vda1 50268 2036 45981 5% / devtmpfs 487 0 487 0% /dev tmpfs 497 1 497 1% /dev/shm tmpfs 497 1 496 1% /run tmpfs 497 0 497 0% /sys/fs/cgroup tmpfs 100 0 100 0% /run/user/0 【$n 输出指定行案例】 [root@VM_0_3_centos ~]# df -m | grep /dev/vda1 | awk '{printf "/dev/vda1的内存使用率:"}{print $5}' /dev/vda1的内存使用率:5% [root@VM_0_3_centos wulei]# df -m | grep devtmpfs | awk '{printf "devtmpfs的used为:"}{print $3}' devtmpfs的used为:0 【$0 输出当前整行内容】 [root@VM_0_3_centos wulei]# echo "scale=2;0.13+0.4" | bc .53 [root@VM_0_3_centos wulei]# echo "scale=2;0.13+0.4" | bc | awk '{printf "%.3f", $0}' 0.530[root@VM_0_3_centos wulei]# 【输出指定行的指定列】 [root@VM_0_3_centos wulei]# cat wulei.sh 1.1 1.2 1.3 2.1 2.2 2.3 [root@VM_0_3_centos wulei]# awk '{printf "第三列为"} {print $3}' wulei.sh 第三列为1.3 第三列为2.3 [root@VM_0_3_centos wulei]# grep '^2' wulei.sh | awk '{printf "第2行第2列:"}{print $2}' 第2行第2列:2.2 【-F 指定分割符 (查看指定文件,并以tab键作为分隔符输出第二列)】 [root@VM_0_3_centos wulei]# cat wulei.sh 1.1 1.2 1.3 2.1 2.2 2.3 [root@VM_0_3_centos wulei]# cat wulei.sh | awk -F"\t" '{print $2}' 1.2 2.2 -F"\t"等价于BEGIN {FS="\t"} [root@VM_0_3_centos wulei]# cat wulei.sh | awk 'BEGIN {FS="\t"}{print $2}' 1.2 2.2 【END 的用法】 [root@VM_0_3_centos wulei]# cat wulei.sh 1.1 1.2 1.3 2.1 2.2 2.3 [root@VM_0_3_centos wulei]# cat wulei.sh | awk '{printf "第二列:"}{print $2}' 第二列:1.2 第二列:2.2 [root@VM_0_3_centos wulei]# cat wulei.sh | awk '{printf "第二列:"}{print $2} END {print "以上为所有结果\n"}' 第二列:1.2 第二列:2.2 以上为所有结果 【NR 指定行号】 [root@VM_0_3_centos wulei]# cat wulei.sh 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 4.1 4.2 4.3 5.1 5.2 5.3 [root@VM_0_3_centos wulei]# awk 'NR==2 {print $2}' wulei.sh 2.2 [root@VM_0_3_centos wulei]# awk '(NR>=2 && NR<5) {print $2}' wulei.sh 2.2 3.2 4.2
sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)
sed语法:sed [选项] [动作] 文件名
常见的选项与参数:
-n #把匹配到的行输出打印到屏幕
p #以行为单位进行查询,通常与-n一起使用
d #删除指定行显示
a #在行的下面插入新的内容显示
i #在行的上面插入新的内容显示
c #替换指定行显示
s/旧内容/新内容/g #指定内容进行替换展示
sed 's/0%/100%/g' wulei.sh
-i #对源文件进行修改(高危操作,慎用,用之前需要备份源文件)
-e #表示可以执行多条动作
eg:cat -n wulei.sh | sed -n -e 's/100%/新内容/g' -e '/新内容/p'
【 -n p 查看指定行】
[root@VM_0_3_centos wulei]# df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# df -m | sed -n '2p'
/dev/vda1 50268 2034 45982 5% /
【搜索】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 100% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 100% /sys/fs/cgroup
tmpfs 100 0 100 100% /run/user/0
[root@VM_0_3_centos wulei]# sed -n '/100%/p' wulei.sh
devtmpfs 487 0 487 100% /dev
tmpfs 497 0 497 100% /sys/fs/cgroup
tmpfs 100 0 100 100% /run/user/0
【 d 不显示指定行】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# sed '2d' wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
【 a 插入显示】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# sed '2a 吴磊' wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
吴磊
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]#
【 i 插入显示】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# sed '4i 6666666666666' wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
6666666666666
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
【 c 替换指定行显示】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# sed '2c 吴磊吴磊吴磊' wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
吴磊吴磊吴磊
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
【 s 指定内容进行替换展示】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# sed 's/0%/100%/g' wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 100% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 100% /sys/fs/cgroup
tmpfs 100 0 100 100% /run/user/0
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
【 -i 修改源文件】
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 0% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 0% /sys/fs/cgroup
tmpfs 100 0 100 0% /run/user/0
[root@VM_0_3_centos wulei]# sed -i 's/0%/100%/g' wulei.sh
[root@VM_0_3_centos wulei]# cat wulei.sh
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/vda1 50268 2034 45982 5% /
devtmpfs 487 0 487 100% /dev
tmpfs 497 1 497 1% /dev/shm
tmpfs 497 1 496 1% /run
tmpfs 497 0 497 100% /sys/fs/cgroup
tmpfs 100 0 100 100% /run/user/0
【 -e 执行多条命令 (查看文件并输出行号,将结果传给sed命令,替换指定内容后 再展示出来)】
[root@VM_0_3_centos wulei]# cat -n wulei.sh | sed -n -e 's/100%/新内容/g' -e '/新内容/p'
3 devtmpfs 487 0 487 新内容 /dev
6 tmpfs 497 0 497 新内容 /sys/fs/cgroup
7 tmpfs 100 0 100 新内容 /run/user/0
[root@VM_0_3_centos wulei]# cat -n wulei.sh
1 Filesystem 1M-blocks Used Available Use% Mounted on
2 /dev/vda1 50268 2034 45982 5% /
3 devtmpfs 487 0 487 100% /dev
4 tmpfs 497 1 497 1% /dev/shm
5 tmpfs 497 1 496 1% /run
6 tmpfs 497 0 497 100% /sys/fs/cgroup
7 tmpfs 100 0 100 100% /run/user/0
if、for、case、while分支循环函数
if 分支判断 语法: (1)单个判断(单分支循环): if [ 条件判断 ]; then 执行动作 fi (2) if [ 条件判断 ]; then 执行动作 else 执行动作 fi (3)多个判断(多分支循环): if [条件判断]; then 执行动作 elif [条件判断]; then 执行动作 elif [条件判断]; then 执行动作 fi 【if脚本案例】 #!/bin/bash #《if脚本案例》 read -p "请输入文件名:" filename if [ -e $filename ]; then echo "$filename 文件存在" else echo "$filename 文件不存在" fi read -p "请输入数字:" num if [ $num -gt 5 ]; then echo "$num 大于5" elif [ $num -lt 5 ]; then echo "$num 小于5" else echo "$num == 5" fi ===================================== case分支判断:case循环常使用于多重分支,与if不同的是,if可以判断多个条件,case一次只能判断一种条件 语法: case 变量 in 值1 ) 执行动作1 ;; 值2 ) 执行动作2 ;; 值3 ) 执行动作3 ;; .... esac 【case脚本案例】 #!/bin/bash #《case分支案例》 read -p "请输入你要查询天气的城市:" city case $city in '北京') echo "北京下雪, 温度 2 ~ -5摄氏度" ;; '深圳') echo "深圳晴天, 温度23 ~ 15摄氏度" ;; *) echo "您的输入地点有误" esac ===================================== for循环控制 语法: (1)for 变量名 in 值1 值2 值3 do 执行动作 done (2)for 变量名 in `命令` do 执行动作 done (3)for ((条件)) do 执行动作 done 【for脚本案例】 #!/bin/bash #《for脚本案例》 echo "语法1案例" for i in 1 2 3 4 5 6 7 8 9 10 do echo "$i" sleep 0.1 #休眠0.1秒 done echo "语法2案例" #seq 1 10 会直接打印出1 10 for i in `seq 1 10` do echo "$i" done echo "语法2案例" # 现在有这么一个文件,我要ping这些主机是否能够连接(ping -c n 表示ping n次的意思,不然会一直ping) # [root@VM_0_3_centos ~]# cat a.txt # www.jd.com # 192.168.100.100 # www.baidu.com for i in $(cat a.txt) do ping -c 1 $i 1>/dev/null && echo "$i 能够连接" ping -c 1 $i 1>/dev/null || echo "$i 连接失败" done echo "语法3案例" for (( i=1;i<11;i++ )) do echo "遍历 $i" done ===================================== while 循环 应用场景:while循环是条件循环也是不定循环,只要条件判断式成立,循环就会一直进行着。 直到判断式不成立 或者 选择跳出循环 才会结束 语法结构: while [ 条件判断式 ] do 执行动作 done 【while脚本案例】 #!/bin/bash #《while脚本》 n=6 m=9 while [ $m -gt $n ] do echo "n为: $n" n=$[ $n + 1 ] done echo "n = $n end"
Linux定时任务
1. 创建脚本 vim /apps/deploy/intelligent-shelf/clear-log.sh 2. 编写脚本内容 echo '' > /apps/logs/intelligent-shelf/catalina.out echo '' > /apps/logs/wowcolour-shelf/catalina.out 3. 赋予权限 chmod 777 /apps/deploy/intelligent-shelf/clear-log.sh 4. 输入 crontab -e 开始编写定时任务(下面是定时脚本) 0 10 * * * /apps/deploy/intelligent-shelf/clear-log.sh 5. 重启定时任务 /bin/systemctl restart crond
。