shell编程基础
一、shell编程基础扩展
1.1 基本格式:
!/bin/bash
#! 指定脚本用的命令解释器
执行脚本
sh:执行脚本
sh -x:显示执行脚本的过程
1.2 变量:
临时存放数据的,方便脚本中重复使用
1.2.1命名规则:
看见变量的名称,就能知道变量的作用
不能以数字开头
1.2.2引号系列:
单引号:所见即所得
双引号:与单引号类似,能解析特殊符号`` [图片上传失败...(image-f14e09-1559560896535)]!
不加引号:与双引号类似,可以支持通配符* {}
反引号:优先执行里面的命令
1.2.3变量分类:
1>局部变量(普通变量)
2>全局变量(环境变量)
特点:
系统创建,在大部分地方意思一样,都是大写
env:可以系统中部分内置变量
创建环境变量:在普通变量的前面加上export,如export aaa=123
常用环境变量:
PATH:记录命令的位置
PS1:记录命令提示符的格式
LANG:字符集语言
1.2.4局部变量与环境变量的区别:
局部变量只在当前环境使用,换了环境就失效
环境变量无论哪里都可以使用
https://www.processon.com/view/link/5a0e4380e4b06c8e10923353
image1.2.5特殊变量:
数字:表示脚本的第几个参数
#:命令行参数的个数;判断参数的个数
$*:脚本的所有参数
[root@m01 ~]# cat ceshi.sh
#!/bin/bash
echo $0 $1 $2
x=$1
y=$2
awk -vn1=$x -vn2=$y 'BEGIN{print "jia:"n1+n2}'
awk -vn1=$x -vn2=$y 'BEGIN{print "jian:"n1-n2}'
awk -vn1=$x -vn2=$y 'BEGIN{print "cheng:"n1*n2}'
awk -vn1=$x -vn2=$y 'BEGIN{print "chu:"n1/n2}'
[root@m01 ~]# sh ceshi.sh 1000 25
ceshi.sh 1000 25
jia:1025
jian:975
cheng:25000
chu:40
[root@m01 ~]#
awk中参数-v的作用:命令行与awk的桥梁
1.3判断
1.3.1 特殊符号:
&&:前1个命令执行成功,在执行后面的命令
||:前1个命令执行失败,在执行后面的命令
1.3.2条件表达式:[ ]
[ -d /tmp/aaa ] :判断目录是否存在
[ -f /tmp/aaa ] :判断文件是否存在
查询帮助命令:man test
\\如果前面的目录存在,显示目录已存在
[root@m01 ~]# [ -d /tmp/aaa ] && echo 'dir is exsit'
\\如果前面的目录不存在,显示目录不存在
[root@m01 ~]# [ -d /tmp/aaa ] || echo 'dir is not exsit'
1.3.3 比大小
与if判断语句相结合
-eq:
equal(等于)
==
-ne:
not equal(不等于)
!=
-gt:
great than(大于)
>
-ge:
great equal(大于等于)
>=
-lt:
less than(小于)
<
le:
less equal(小于等于)
<=
1.3.4 if条件判断
格式:
单分支判断
双分支判断
多分支判断
书写脚本comp.sh比较两个数字的大小
注:exit 退出当前shell程序
[root@m01 /server/scripts]# cat comp.sh
#!/bin/bash
a=$1
b=$2
//-----------------------单分支判断-------------------
if [ $# -ne 2 ]
then
echo "$0 num1 num2"
exit
fi
//-----------------------------------------------------
//-----------------------双分支判断------------------
if [ $a -gt $b ]
then
echo "$a>$b"
else
echo "$a<=$b"
fi
//----------------------------------------------------
[root@m01 /server/scripts]# sh comp.sh 8 3
a>b
[root@m01 /server/scripts]# sh comp.sh 8 3
8>3
[root@m01 /server/scripts]# sh comp.sh 3 10
3<=10
[root@m01 /server/scripts]# sh comp.sh
comp.sh num1 num2
[root@m01 /server/scripts]#
[root@m01 /server/scripts]# cat comp.sh
#!/bin/bash
a=$1
b=$2
//-----------------------多分支判断------------------
if [ $a -gt $b ]
then
echo "$a>$b"
elif [ $a -lt $b ]
then
echo "$a<$b"
else
echo "$a==$b"
fi
//----------------------------------------------------
[root@m01 /server/scripts]# sh comp.sh 22 45
22<45
[root@m01 /server/scripts]# sh comp.sh 22 4
22>4
[root@m01 /server/scripts]# sh comp.sh 33 33
33==33
[root@m01 /server/scripts]#
1.4 for循环
[root@m01 /server/scripts]# cat forxunhuan.sh
#!/bin/bash
for day in {01..7}
do
echo "week$day 带小远去找 girl$day 跳舞"
done
[root@m01 /server/scripts]# sh xunhuan.sh
week01 带小远去找 girl01 跳舞
week02 带小远去找 girl02 跳舞
week03 带小远去找 girl03 跳舞
week04 带小远去找 girl04 跳舞
week05 带小远去找 girl05 跳舞
week06 带小远去找 girl06 跳舞
week07 带小远去找 girl07 跳舞
[root@m01 /server/scripts]#
1.5 生产案例:判断定时任务是否运行中
判断定时任务是否运行中?(运行中显示crond is running,没有运行显示crond is guale)
编写定时任务服务检查脚本
如何判断crond服务是否运行中
systemctl is-active crond
systemctl status crond
ps -ef|grep crond
编写脚本
[root@m01 /server/scripts]# cat check-service.sh
#!/bin/bash
count=$( ps -ef|grep crond|grep -v 'grep'|wc -l)
if [ $count -eq 1 ];then
echo 'crond is running'
else
echo 'crond is guale'
fi
\\\执行脚本
[root@m01 /server/scripts]# sh check-service.sh
crond is running
\\显示脚本的执行过程
[root@m01 /server/scripts]# sh -x check-service.sh
++ ps -ef
++ grep crond
++ grep -v grep
++ wc -l
+ count=1
+ '[' 1 -eq 1 ']'
+ echo 'crond is running'
crond is running
[root@m01 /server/scripts]#
二、作业
2.1 #批量添加用户设置随机密码 for循环实现
[root@oldboyedu /server/scripts]# cat batch-adduser.sh
#!/bin/bash
. /etc/profile
for item in {01..5}
do
#pass=$(date +%N)
pass=$(tr -cd 'a-zA-Z0-9' </dev/urandom| head -c8)
username="ceshi$item"
useradd $username
echo $pass|passwd --stdin $username
echo $username":"$pass>>/etc/password.txt
done
[root@oldboyedu /server/scripts]#
[root@oldboyedu /server/scripts]# tail -n5 /etc/passwd
ceshi01:x:1014:1014::/home/ceshi01:/bin/bash
ceshi02:x:1015:1015::/home/ceshi02:/bin/bash
ceshi03:x:1016:1016::/home/ceshi03:/bin/bash
ceshi04:x:1017:1017::/home/ceshi04:/bin/bash
ceshi05:x:1018:1018::/home/ceshi05:/bin/bash
2.2 #批量修改文件名字 for或rename
比如:touch /oldboy/oldboy.txt 批量.txt修改为.jpg
模拟环境
[root@oldboyedu ~]# mkdir -p /oldboy/alex/
[root@oldboyedu ~]# cd /oldboy/alex
[root@oldboyedu /oldboy/alex]# touch oldboy{01..5}.txt
[root@oldboyedu /oldboy/alex]# tree
.
├── oldboy01.txt
├── oldboy02.txt
├── oldboy03.txt
├── oldboy04.txt
└── oldboy05.txt
0 directories, 5 files
[root@oldboyedu /oldboy/alex]#
方法一:for循环
方法二:rename
[root@oldboyedu /oldboy/alex]# rename .txt .jpg /oldboy/alex/*.txt
[root@oldboyedu /oldboy/alex]# tree
.
├── oldboy01.jpg
├── oldboy02.jpg
├── oldboy03.jpg
├── oldboy04.jpg
└── oldboy05.jpg