shell脚本介绍

shell是什么?
shell是一种脚本语言
可以使用逻辑判断、循环等语法
可以自定义函数
shell是系统命令的集合
shell脚本可以实现自动化运维,能大大增加我们的运维效率。

shell脚本结构和执行
开头需要加#!/bin/bash
以#开头的行作为解释说明
脚本的名字以.sh结尾,用于区分这是一个shell脚本
执行方法有两种
chmod +x 1.sh : ./1.sh
bash 1.sh
查看脚本执行过程 : bash -x 1.sh
查看脚本是否语法错误 bash -你1.sh

date命令 :
date +%Y-%m-%d , date +%y-%m-%d 年月日
date +%H:%M:%S = date +%T 时间
date +%s 时间戳
date -d @150243523
date -d “+1day” 一天后
date -d “-1day” 一天前
date -d “-1 month” 一月前
date -d "-1 min " 一分钟前
date +%w,date +%w 星期

shell脚本中的变量
当脚本中使用某个字符串比较频繁并且字符串长度很长时就应该使用变量代替
使用条件语句时,常使用变量 if [ $a -gt 1 ] ; then … ; fi
引用某个命令的结果时,用变量代替 n=‘wc -l 1.txt’
写和用户交互的脚本时,变量也是必不可少的 read -p "Input a number : " n: ehco n 如 果 没 写 这 个 n , 可 以 直 接 使 用 n 如果没写这个n,可以直接使用 nn使REPLY
内置变量 $0 , $1 ,$2 … $0表示脚本本身,$1第一个参数 $2 第二 … KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ 表示参数个数 … ( a + a+ a+b)或者 [ [ [a+$b]

shell中的逻辑判断
格式1:if 条件 ;then 语句 ;fi
格式2:if 条件 ;then 语句 ;else语句:fi
格式3:if … then … : elif … then … else … fi
逻辑判断表达式 :if [ $a -gt $b ] ; if [ $a -lt 5 ]: if [ $b -eq 10 ] 等 -gt (>) ; -lt(>=); -le(<=) ; -eq(–) ; -ne(!-) 注意到处都是空格
可用使用 && || 结合多个条件
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
if [ $b -gt 5 ] || [ $b -lt 3 ] ;then
案例 :
if [ $a -gt 5 ] && [ $a -lt 10 ] == if [ $a -gt 5 -a $a -lt 10 ]

if [ $b -gt 5 ] || [ $b -lt 3 ] == if [ $b -gt 5 -o $b -lt 3 ]

if 判断文件、目录属性
[ -f file ]判断是否是普通文件,且存在
[ -d file ]判断是否目录,且存在
[ -e file ]判断文件或目录是否存在
[ -r file ]判断是否可读
[ -w file ]判断是否可写
[ -x file ]判断是否可执行
注意 :root用户对文件的读写比较特殊,即使一个文件没有给root用户读或者写的权限,root用户照样可以读或者写

案例
1、判断1.sh是不是文件
#if [ -f 1.sh ]; then echo 1;fi
2、判断文件或者目录是否存在
#if [ -e 1.sh ]; then echo 1;fi
3、往文件或者目录中添加内容
#if [ -f /root/shell/a.sh ]; then echo 1; else echo “111” > a.sh;fi
4、判断文件或者目录是否可读
#if [ -r 1.sh ]; then echo 1;fi

if判断的一些特殊用法
if [ -z “ a &quot; ] 这 个 表 示 当 变 量 a 的 值 为 空 时 会 怎 么 样 i f [ − n &quot; a&quot; ] 这个表示当变量a的值为空时会怎么样 if [ -n &quot; a"]aif[n"a” ] 表示当变量a的值不为空
if grep -q ‘123’ 1.txt ; then 表示文件不存在时会怎么样
if [ ! e file ];then 表示文件不存在时会怎么样
[ ] 中不能使用<.>,==,!= ,>= ,<=这样的符号

案例 :
#a=
#echo KaTeX parse error: Expected 'EOF', got '#' at position 3: a #̲if [ -z "a" ]; then echo “a为空”;fi
a为空
#a=1
#if [ ! -z “KaTeX parse error: Expected 'EOF', got '#' at position 30: …o "a为空";fi a为空 #̲if [ -n "a” ]; then echo “a不为空”;fi
a不为空
#a=
#if [ ! -n “$a” ]; then echo “a不为空”;fi
a不为空

for 循环

语法 :for 变量名 in 条件;do … done
案例1
#!/bin/bash
sum=0
for i in ‘seq 1 100’
do
sum= [ [ [sum+$i]
echo $i
done
echo $sum

文件列表循环
#!/bin/bash
cd /etc/
for a in ‘ls /etc/’
do
if [ -d $a ]
then
ls -d $a
fi
done

案例 1 :
#!/bin/bash
read -p “Please input a number: " n
if [ -z “$n” ]
then
echo “Please input a number.”
exit 1
fi
n1='echo n ∣ s e d ′ s / [ 0 − 9 ] / / g ′ ′ i f [ − n &quot; n|sed &#x27;s/[0-9]//g&#x27;&#x27; if [ -n &quot; nseds/[09]//gif[n"n1” ]
then
echo “Please input a number.”
exit 1
fi
if [ $n -lt 60 ] && [ $n -ge 0 ]
then
tag=1
elif [ $n -ge 60 ] && [ $n - lt 80 ]
then
tag=2
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
tag=4
else
tag=0
fi
case $tag in
1)
echo “not ok”
;;
2)
echo “ok”
;;
3)
echo “ook”
;;
4)
echo “oook”
;;
*)
echo “The number range must be 0-100.”
;;
esac

案例 2 :
#!/bin/bash
sum=0
for i in ‘seq 1 100’
do
sum= [ [ [sum+$i]
echo $i
done
echo $sum

文件列表循环
#!/bin/bash
cd /etc/
for a in ‘ls /etc/’
do
if [ -d $a ]
then
ls -d $a
fi
done

注意 :
read -p #表示交互式的
sed #作用是查找替换
sum #赋值一个变量

while循环

语法 while 条件 : do … ;done
案例1 :监控负载
#!/bin/bash
while :
do
load=‘w|head -1 | awk -F ‘load average: ’ ‘{print $2}’ | cut -d -f1’
if [ l o a d − g t 10 ] t h e n t o p ∣ m a i l − s &quot; l o a d i s h i g h : load -gt 10 ] then top | mail -s &quot;load is high: loadgt10]thentopmails"loadishigh:load" asldkfls@11.com
fi
sleep 30
done

注意 :
if [ $load -gt 10 ] #如果负载大于10,就发邮件
-s #指定主题名称,后面目标邮件地址
top #指定发邮件的内容

案例2
#!/bin/bash
while :
do
read -p “Please input a number: " n
if [ -z “$n” ]
then
echo “you need input sth.”
continue
fi
n1='echo n ∣ s e d ′ s / [ a − 9 ] / / g ′ ′ i f [ − n &quot; n|sed &#x27;s/[a-9]//g&#x27;&#x27; if [ -n &quot; nseds/[a9]//gif[n"n1” ]
then
echo “you just only input numbers.”
continue
fi
break
done
echo n 注 意 : i f [ − z &quot; n 注意 : if [ -z &quot; nif[z"n" ] #判断有没有输入东西
KaTeX parse error: Expected 'EOF', got '#' at position 10: n1 #̲n1不为 空,说明输入的不是数字

break跳出循环

#!/bin/bash
for i in ‘seq 1 5’
do
echo $i
if [ $i ==3 ]
then
break
fi
echo $i
done
echo aaaa

忽略continue之下的代码,直接进行下一次循环
#!/bin/bash
for i in ‘seq 1 5’
do
echo $i
if [ $i == 3 ]
then
continue
fi
echo $I
done
echo $i

.cuntinue结束本次循环

忽略continue之下的代码,直接进行下一次循环
#!/bin/bash
for i in ‘seq 1 5’
do
echo $i
if [ $i == 3 ]
then

exit直接退出脚本

#!/bin/bash
for i in ‘seq 1 5’
do
echo $i
if [ $i == 3 ]
then
exit
fi
echo $i
done
echo aaaaa

案例 :
在行下面添加注释
在这里插入图片描述

注意 :常见的循环体 :for、while ; 常见的循环体 中的:break、continue ;

shell脚本中的函数

函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。
格式:
function f_name()
{
command
}
函数必须要放在最前面
示例1
#!/bin/bash
input() {
echo $1 $2 $# KaTeX parse error: Expected 'EOF', got '}' at position 3: 0 }̲ input 1 a b 示例…[$1+$2]
echo $s
}
sum 1 2
示例3 #获取网卡的IP地址
#!/bin/bash
ip() {
ifconfig | grep -A1 “$1” |tail -1 |awk ‘{print $2}’ | awk -F’:’ ‘{print $2}’
}
read -p “Please input the etho name: " e
myip=‘ip e ’ e c h o &quot; e’ echo &quot; eecho"e address is $myip”

案例:
查看某一个网卡的IP地址
在这里插入图片描述

shell中的数组

定义数组 a=(1 2 3 4 5); echo ${a[@]}
echo ${#a[@]} #获取数组的元素个数
echo ${a[2]} #读取第三个元素,数组从0开始
echo KaTeX parse error: Expected 'EOF', got '#' at position 19: …*]} #̲等同于{a[@]} 显示整个数组
数组赋值
a[1]=100;echo ${a[@]}
a[5]=2; echo ${a[@]} #如果下标不存在则会自动添加一个元素
数组的删除
uset a: unset a[1]
数组分片
a=(‘seq 1 5’)
echo ${a[@]:0:3} #从第一个元素开始,截取3个
echo ${a[@]:1:4} #从第二个元素开始,截取4个
echo ${a[@]:0-3:2} #从倒数第3个元素开始,截取2个
数组替换
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: …a[@]/3/100} a={{a[@]/3/100}}

案例:

在这里插入图片描述
在这里插入图片描述

什么是正则
正则就是一串有规律的字符串
掌握好正则对于编写shell脚本有很大帮助
各种编程语言中都有正则,原理是一样
本章将要学习grep/egrep、sed、awk
grep

grep [-cinvABC] ‘word’ filename
-c #行数
-i #不区分大小写
-n #显示行号
-v #取反
-r #遍历所有子目录
-A #后面跟数字,过滤出符合要求的行以及下面的n行
-B #同上,过滤出符合要求的行以及上面n行
-C #同上,同时过滤出符合要求的行以及上下各n行
grep -n ‘root’ /etc/passwd #打印出来包含root的行并打印出来行号
grep -nv ‘nologin’ /etc/passwd #打印出来,不包含nologin的行,并打印出来行号
grep ‘[0-9]’ /etc/inittab #打印出来包含数字的行
grep -v ‘[0-9]’ /etc/passwd #打印出来不包含数字的行
grep -v ‘^#’ /etc/inittab/ #打印出来不包含#开头的行
grep ‘^#’ /etc/inittab/ #打印出来包含#的行
grep ‘nKaTeX parse error: Expected 'EOF', got '#' at position 25: …ittab/ #̲打印出来以n结尾的行 grep…’ /etc/inittab/ #打印出来空行的行
grep -v ‘^$’ /etc/inittab/ #打印出来不包含空行的行

grep -v ‘#’ /etc/inittab |grep -v ‘^$’ #打印出来不以#号开头的行和空行
grep ‘[a-zA-Z]’ test.txt #打印出来不包含大小写 字母的行
grep ‘r.o’ test.txt #包含r和o两个字符的行
注意 : .表示任意一个字符
表示一个或者多个字符
.* 表示通配,表示匹配所有的
grep ‘oo*’ test.txt #打印出来包含两个o以及以上的行,
grep ‘.*’ test.txt #匹配到文档中所有的内容
grep ‘0{2}’ /etc/passwd #打印出来,包含两个0,以及四个0的行
grep 'r.*n /etc/passwd #打印出来,r和n之间所有的内容

案例 :
打印出来,包含root的行以及其下面的两行
在这里插入图片描述
在这里插入图片描述

egrep -v ‘#|#’ /etc/inittab ====grep -vE ‘#|#’ /etc/inittab #打印出来不以#号开头的行和空行
egrep ‘ro+’ /etc/passwd #打印出来,包含一个或者多个o字符的行
注意 :+表示一个或者多个字符
?表示零个或者多个字符

egrep ‘ro{2}’ /etc/passwd #打印出来o要出现两次的行
egrep ‘0{2}’ /etc/passwd #打印出来o要出现两次的行
egrep ‘0+’ /etc/passwd #打印出来o要出现一次以上的行
egrep ‘oo?’ /etc/passwd #打印出来,两个o以及以上的行。
egrep ‘root|nologin’ /etc/passwd
egrep ‘(oo){2}’ /etc/passwd #打印出来,包含两个oo的两倍,也就是四个o的行。

sed查找、替换、打印

sed -n '5’p test.txt #打印第五行出来
sed -n ‘1,5’ test.txt #打印第一到第五行出来
sed -n '1,KaTeX parse error: Expected 'EOF', got '#' at position 29: … #̲打印第一到最后一行出来 sed…'p test.txt #
sed -n '/r…o/'p test.txt #打印出来包含r和o的行
sed -n 'oo*'p test.txt #打印出来包含两个o的行
sed -e '1’p -e '/111/'p -n test.txt #打印出来第一行,并打印出来包含111的行
sed '1’d test.txt #删除第一行
sed '1,3’d test.txt #删除第一到第三行
sed '/oot/'d test.txt #删除包含oot的行
sed ‘s/nologin/123aaa/g’ test #nologin替换成123aaa
sed ‘#ot#g’ test.txt #
sed ‘s/[0-9]//g’ test.txt #删除所有的数字
sed ‘s/[a-zA-Z]//g’ test.txt #删除所有的字母
sed ‘s/[^a-zA-Z]//g’ test.txt #删除所有非字母的字符
sed -r ‘s/(root)(.#)(bash)/\3\2\1/’ test.txt #
sed ‘s/^.$/123&/’ test.txt #每一行最前面添加一个123
sed -r 's/(.
)/123\1/’ test #每一行最前面添加一个123
sed -r ‘s/(.*)/\1123/’ test #每一行最后面添加一个123
sed -i ‘s/ot/to/g’ test.txt #把ot替换成to,将结果保存到test.txt

awk

head -n2 test.txt | awk -F ‘:’ ‘{print $1}’ #打印第一段,
head -3 test | awk -F ‘:’ ‘{OFS="#"} {{print $0}}’ #打印最后一段,
awk -F ‘:’ ‘{print $1"#"$2"#"$3"#"$4}’ #把1,2,3,4个字符之间
awk -F ‘:’ ‘$1 ~/oo/’ test.txt #打印出来第一段匹配oo的行
awk -F ‘:’ ‘/root/ {print $1,$3} /test {print $1,$3}’ test.txt #包含root的行,打印出来第一和第三行;包含test的,把第一段和第三段打印出来
awk -F ‘:’ ‘$3==“0”’ /etc/passwd #打印出来第三段为零的行
awk -F ‘:’ ‘$3>=“500”’ /etc/passwd #打印出来第三段大于等于500字符串的行 ;双引号里面是字符串
awk -F ‘:’ ‘$3>=500’ /etc/passwd #打印出来第三段是500数字的行
awk -F ‘:’ ‘$7 !="/sbin/nologin"’ /etc/passwd #打印出来第七行,不等于/sbin/nologin
awk -F ‘:’ ‘$3>“5” && $3<“7”’ /etc/passwd #打印出来,第三段大于5,并且小于7
awk -F ‘:’ ‘$3!=$4’ test #打印出来,第三行不等于第四行的内容
awk -F ‘:’ ‘$3>1000 || $7=="/bin/bash"’ /etc/passwd #打印出来,第三行大于1000,或者第七行是/bin/bash
head -5 /etc/passwd |awk -F ‘:’ ‘{OFS="#"} {print $1,$2,$3,$4}’ #
awk -F ‘:’ ‘{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}’ /etc/passwd #

head -n3 /etc/passwd | awk -F ‘:’ ‘{print NF}’ #
head -n3 /etc/passwd | awk -F ‘:’ ‘{print NR}’ #
awk ‘NR>40’ /etc/passwd #
awk -F ‘:’ ‘NR<20 && $1 ~ /roo/’ /etc/passwd #
head -n 3 /etc/passwd |awk -F ‘:’ ‘$1=root’ #
awk -F ‘:’ ‘{(tot=tot+$3): END {print tot}}’ /etc/passwd #
awk -F ‘:’ ‘{if ($1==“root”) {print $0}}’ /etc/passwd #

注意 :
查找root的行,三种方法 :

#grep ‘root’ test
#awk ‘root’ test
#sed -n '/root/'p test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寰宇001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值