shell编程基础

2019-06-03  本文已影响0人  A宽宽

一、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

image

1.2.5特殊变量:

?:上一条命令的返回值,返回值为0模式正确数字:表示脚本的第几个参数
0:表示脚本的名字#:命令行参数的个数;判断参数的个数
$*:脚本的所有参数

[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

上一篇 下一篇

猜你喜欢

热点阅读