Shell编程及自动化运维实现—第1章—变量。

tech2022-07-10  111

目录

一SHELL前言

1.什么是shell

2shell语言的特点

3.能做什么

4.SHELL执行方式

shell多种执行方式

二BASH SHELL1

1.shell课程概览

2shell解释器有哪些

三变量

简介

变量的类型

变量的运算

练习

 扩展

思考题


一SHELL前言

1.什么是shell

Shell 是一个应用程序,它连接了用户和 Linux 内核。(命令解释器)

2shell语言的特点

SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。

Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。

Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;

作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、

建立文件并以并行的方式协调各个程序的运行。

因此,对于用户来说,shell是最重要的实用程序,

深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

3.能做什么

1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...) 2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx) 3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID) 4. 日志分析处理程序(PV, UV, 200代码, !200代码, top 100, grep/awk) 5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond) 6. 自动化管理程序(批量远程修改密码,软件升级,配置更新) 7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL) 8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL) 9. 自动化扩容(增加云主机——>业务上线) zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线) 10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现 11. Shell可以做任何事(一切取决于业务需求)

4.SHELL执行方式

shell多种执行方式

1.准备测试脚本

# vim 1.sh           

 #!/usr/bin/bash

 echo "hello 2020"  

 read  -p  "请输入你的姓名:"     name

echo  "$name ,你很有优秀"

2.执行

语法1:bash  1.sh

语法2:sh  1.sh

执行方法是:   

语法3:  1.sh

语法4:source   1.sh 

语法5 :. /            //需要授权才能执行  chmod  +x 1.hs  

4.执行区别

==准备环境==

# vim  2.sh

  #!/bin/bash

  cd/home

  ls 

==使用四种执行方式:#sh   2.sh  ==  

==观察目录改变了。说明影响的是当前。并使用子shell执行方式执行。==

第1、2种测试环境  子shell  # pwd   ---->root

第3、4种测试环境 本shell   # pwd ---->home

二BASH SHELL1

1.shell课程概览

  shell特性:易学,高效

  shell变量

  shell条件测试,判断

  shell数值运算

  流控、循环

     命令汇总

if  case  for  while  until  break跳过   continue终止  exit退出  array数据统计   function函数

  企业项目

2shell解释器有哪些

shell命令就是前一阶段所学习的大部分命令组合到一起。

Linux支持的shell有哪些?

# cat  /etc/shells

或者 # chsh   -l

   

三变量

简介

shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。

变量的类型

1.自定义变量

==特性:==

1. 自定义变量(示例:1.sh引入变量) 定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115  引用变量: $变量名${变量名} 查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量) 取消变量: unset 变量名 作用范围: 仅在当前shell中有效

==示例0==

使用变量前:

ping -c1 192.168.100.10 &>/dev/null  && echo 192.168.100.10up || echo 192.168.100.10down

ping   -c1 一次    此ID  结果不用提示   能ping通--->ip+up    ping不通--->ip+down

使用变量后:(在脚本里)

#!/bin/bash

 ip=192.168.56.2

 ping -c1 $ip &>/dev/null  && echo "$ip up" || "echo $ip down"

==变量赋值(定义变量)==

1.显示赋值

变量名=变量值

示例:

   ip1=192.168.56.142

  school="BeiJing 1000phone"             //引号里为一个内容,转掉空格

  today1=`date + %F`                  //优先执行

  today2=$(date + %F)               // $( ) 优先执行 

2.read从键盘读取变量值

read  变量名     

read  -p  "提示信息"  变量名         //  -t 等待5秒,后超时

read -n 2  变量名                // -n 只记录几个字符

read  -p "请输入您的ip地址:"   ip

ping  -c1  $ip  &>/etc/null && echo "$ip up"  ||  echo  "$ip down"

==

2.环境变量

定义环境变量:

export  back_dir2=/home/backup

export back_dir1将自定义变量转换成环境变量

引用环境变量 :   $变量名 或 ${变量名}

查看环境变量: echo$变量名   

                           env  例如:env | grep back_dir2

取消环境变量:unset  变量名

变量中用范围:在当前shell有效

使’用开机、登录有效,将变量放到 ~/.bash_profile   //开机自启的文件中

3.位置变量和预定义变量(了解)

语法:

命令   参数1   参2  参3  参4  参5  参6  参7  参8...

          $1    $2    $3   $4    $5    $6   $7$   8$....

预先定义过的变量

  $0   脚本名

  $*  所有参数            //忽略空格,所有的参数被认为一个字符,用 " " 分开

  $@  所有参数         //默认空格有分字段,一个参数有空格时用 " "括起来

  $#  参数的个数

  $$  当前进程的pid

  $!  上一个后台进程的PID

  $?  上个命令的返回值

eg1:

#vim 1.sh

#!/usr/bin/bash

echo "第二个位置参数是$2"

echo " $1"            //第1个位置参数是

echo "$*"             //所有参数

echo "$#"               //参数个数

echo "$0"               //脚本名

echo '$1='$1            //   '$1='  字符

sh  1.sh  1  2   3  4   5   6      //运行

 

变量的运算

1小数运算

==expr==

语法:expr  1+2            //1+2--->3

expr $num1 + $num2

+ (加)    -(减)      \*(乘 \是转义符)     /(除)    %(余)

==$(())==

echo $(( $num1 + $num2 ))

echo $((num1 + num2 )

echo $((5-3*2))

echo $(((5-3)*2))

echo $((2**3))           //2的3次方    ** 幂

sum=$((1+2));echo $sum

==let==

let sum =2+3; echo $sum

i=999; let i++; echo $i

2.小数运算(了解)   bc   没有的话,需要下载yum -y install bc

echo "2*4" |bc

echo "2^4" |bc

echo "scale=2; 6/4" | bc

awk  'BEGIN {PRIT 1/2}'

echo "print 5.0/2" |python

bc : 交互运算器

scale=2 保留小数点后两位

awk    //相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告

python    //写脚本,做配置文件

练习

1.  编写脚本,创建用户user1,并为用户设置初始密码为666666(无变量)

#!/bin/bash

useradd userA

echo "666666" |passded  --stdin userA&> /dev/null     

 //通过管道想命令中输入123456 ,结果不查看放入null

echo "用户创建成功,密码为666666"

2.编写脚本,创建用户,并为用户创建初始密码为123456(有变量)

#!/bin/bash

name=userD              //变量

useradd $name            //调用变量

echo "123456" | passwd --stdin $name &> /dev/null

echo "$name create finished,the password is 123456"

3.编写脚本,创建用户userA,并为用户设置初始密码为123456(有变量。键盘读取)

#!/bin/ bash

read  -p  "请你输入要创建的用户的名字:"  name                //read -p 读取数据

useradd  $name 

echo "123456" |passwd --stdin  $name  &>/dev/null

echo "$name 用户创建成功,密码为123456" 

4.编写脚本,配置本地yum源

#!/bin/bash

mount  /dev/cdrom  /mnt  &> /dev/null

rm -rf /etc/yum.repos.d/*

cat << EOF > /etc/yum.repos.d/yum.repo [local] name=localyum baseurl=file:///mnt enabled=1 gpgcheck=0 EOF

yum repolist all     

 扩展

查询变量时,进行的“内容、值”的删除和替换

==“内容”的删除”==(#%前后取值 )

语法:

示例1:从前往后删除:#

# url=www.sina.com.cn # echo ${#url} 获取变量值的长度 15 # echo ${url} 标准查看 www.sina.com.cn ———————————————————————————— # echo ${url#www.}        //删除显示 sina.com.cn # echo ${url#*.} 从前往后,最短匹配。删除到点。 sina.com.cn # echo ${url##*.} 从前往后,最长匹配 贪婪匹配。删除到最后一个点 cn ————————————————————————————— 示例2:从后往前删除:% # url=www.sina.com.cn # echo ${url} www.sina.com.cn # echo ${url%.*} 从后往前,最短匹配 www.sina.com # echo ${url%%.*} 从后往前,最长匹配 贪婪匹配 www

工作示例:

# url=www.sina.com.cn

截取二级域名 # echo ${url#*sina.} com.cn

截取主机名 # echo ${url%%.*} www

==索引及切片==(::中间取值)

# url=www.sina.com.cn 从第一个切片到第5个 ]# echo ${url:0:5} www.s

从第5个切5个 # echo ${url:5:5}  ina.c

从第5个开始切 # echo ${url:5} ina.com.cn

==="内容"的替换===(//局部)

定义变量 # url=www.sina.com.cn

将变量中的字段替换成某些字段。

# echo ${url/sina/baidu} www.baidu.com.cn

替换一个:/

# url=www.sina.com.cn # echo ${url/n/N}   www.siNa.com.cn

替换多个: //

# echo ${url//n/N} 贪婪匹配 www.siNa.com.cN

=====变量的整体替代===(-全部替换)==

1         -未定义可替代

    语法         ${变量名-新的变量值}-------------可以替换掉变量的值。(比如:赠送未付费用户礼包的活动)     示例         -无值可替代---------------------------------------------------------

  # unset var1        //取消3个变量   # unset var2   # unset var3

  #             //1变量未定义   # var2=111        //2变量已定义   # var3=        //3变量已定义   # echo ${var1-aaaaa}   aaaaa   # echo ${var2-bbbbb}   111   # echo ${var3-ccccc}

    结论:         未定义                  :会替代        已定义,空值      : 不会被替代

2      :-未定义和空值可替代

语法:

 ${变量名:-新的变量值}未定义,空值        :会替代 有值            : 不会被替代

示例:         :-未定义 和 空值 都会被替换。:-:-:-:-:-:-:-:-:-:-:- # unset var1        //将三个变量未定义 # unset var2 # unset var3

# var2=        //1变量未定义,2变量空值。 # var3=111        //3变量有值。 # echo ${var1:-aaaa} aaaa # echo ${var2:-aaaa} aaaa

只有有值的时候,才不会被替换。 # echo ${var3:-aaaa}111

3:课后思考题。下列符号具备什么含义     示例

# echo ${var3+aaaa}     # echo ${var3:+aaaa}    

# echo ${var3=aaaa}     # echo ${var3:=aaaa}

# echo ${var3?aaaa}     # echo ${var3:?aaaa} 

var1无定义   var2=111   var3=  (空值)     

  

//+空值不会替换,有值会替换 # unset var1 # unset var2 # unset var3# var2=111 # var3= # echo ${var1+aaa}

# echo ${var2+aaa} aaa # echo ${var3+aaa} aaa

 // :+ 无定义、空值不会替换,有值会替换 # unset var3 # unset var2 # unset var1# var2=111 # var3= # echo ${var1:+aaa}

# echo ${var3:+aaa}

# echo ${var2:+aaa} aaa

 // = 未定义可替换,空值,已定义不可替换 # unset var1 # unset var2 # unset var3# var2= # var3=1111# echo ${var1=aaa} aaa # echo ${var2=aaa}

# echo ${var3=aaa} 1111

:= 未定义,空值可替换,有值不可替换 # unset var1 # unset var2 # unset var3# var2= # var3=111 # echo ${var1:=aaa} aaa # echo ${var2:=aaa} aaa # echo ${var3:=aaa} 111

未定义替换并脚本退出,得出当前位置。已定义空和有值不替换。 # unset var1 # unset var2 # unset var3# var2= # var3=111# echo ${var1?aaa} -bash: var1: aaa # echo ${var2?aaa}

# echo ${var3?aaa} 111

:? 未定义,为空被替换,并退出。已定义不替换。 # unset var1 # unset var2 # unset var3# var2= # var3=111 # echo ${var1:?aaa} -bash: var1: aaa # echo ${var2:?aaa} -bash: var2: aaa # echo ${var3:?aaa} 111

思考题

 

 

 

 

 

 

 

 

 

最新回复(0)