shell编程介绍及变量 第1章 如何学好shell编程 1.1 为什么学习shell编程 shell编程在工作中做什么?
shell脚本语言是实现Linux系统管理及自动化运维必须的重要工具。
安装操作系统(手动安全ISO) 自动化安装(kickstart cobbler)shell脚本
初始化操作系统 优化(SSH优化 关闭SElinux 优化防火墙 c6.x iptables C7.xfirewalld NTP时间同步 更改默认YUM源 字符集 安装常用的软件 lrzsz net-tools tree.. wget 隐藏版本信息 加大文件描述符 内核优化…) 初始化写入脚本 自动化执行
安装服务(Nginx PHP MySQL MariaDB NFS sersync REDIS keepalived docker….zabbix shell 脚本自动选择安装)
配置文件(优化)
启动—-停止(centos6.x /etc/init.d/server start centos7 systemctl start server) 系统默认的启动方式 shell脚本 py写的程序 jumpserver python3.5 test.py 传参 –redis 10.0.0.22 –prot 6379 –IPlog – – – python3.5 test.py -h 放入shell脚本命名 log_count.start 停止py服务 log_count.stop ps axu|grep test.py|grep -v grep|awk ‘{print $2}’|xargs kill -9
监控 zabbix cacti(流程) nagios ELK (公司研发监控平台) 监控的值(shell脚本统计)
日志统计 三剑客 日志切割(脚本+定时任务)
1.2 学习shell编程所需基础知识 学好shell编程并通过shell脚本轻松实现自动化管理企业生产系统必备基础如下:
熟练使用vim编辑器,熟悉SSH终端及“vimrc”等的配置。
掌握一定Linux命令基础,至少80个,熟练使用。
熟练掌握Linux正则表达式及三剑客(grep、sed、awk)
熟悉常见的Linux网络服务器部署、优化、日志分析和排错
1.3 如何才能学好shell
掌握Shell基本语法
掌握常见语法 环境变量—数值比较–条件表达式—if判断—for循环–while循环–case语句–函数–数组—条件控制语句 exit continue break
修改脚本内容(完善脚本)形成自己的开发风格
套用 框架(公司中大部分脚本的写法) 熟能生巧,从简单坐骑,简单判断、简单循环
多模仿、多思考
学会分析问题,形成编程思维
编程名字要规范、采用驼峰语法
不要拿来主义,特别是新手
第2章 shell脚本入门 2.1 什么是shell? shell 是一个命令解释器
shell存在于操作系统最外层,负责与用户直接对话,对用户的输入解析给操作系统,并处理各种各样的输出结果,然后输出到屏幕返回给用户。
面试题: linux下默认的shell是? bash
命令解释器 pwd ls
bash? 当前的命令行 和shell脚本 文本内有可执行命令 bash
当前的bash 父shell 文本内的命令 子shell
子shell可继承父shell的变量 父shell无法继续子shell的变量
交互式shell shll等待输入 输入命令 shell执行并返回结果 交互式
非交互式 把可执行命令 放入文本中 定时任务执行 称为非交互式
2.2 什么是shell脚本 shell脚本:当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序被称为shell脚本。
命令的大礼包 把可执行命令放到文件中 称为shell脚本(判断语句 循环语句 数组….)
2.3 shell脚本语言的种类 1.Bourne shell
2.C shell
常用的脚本语言:
PHP Perl Python Shell
Shell脚本语言 优势在于处理偏系统底层的业务,如:一键自动化、优化、监控报警、软件启动、日志分析等脚本。shell更符合Linux运维简单、易用、高效的三大基本原则。
2.4 Shell的书写规范 1) shell脚本存放统一的目录 /server/scripts
2) 脚本名字的结尾使用.sh
3) 脚本的开头 必须有解释器 #!/bin/bash
4) 脚本内有作者信息 脚本信息
5) 每段代码块有注释(尽量使用英文)
6) 标点符号 (语法尽量一次性书写完毕
7) 成对的符号 一次性书写完毕
2.5 第1个Shell脚本 1 2 3 [root@backup /server/scripts] #!bin/bash echo "hello world!"
执行脚本的三种方法:
1 2 3 4 5 6 7 8 9 10 [root@backup /server/scripts] hello world! [root@backup ~] hello world! [root@backup /server/scripts] hello world!
一次性完成for循环语句格式
第3章 Shell变量 3.1 什么是变量? 1 2 3 4 5 [root@backup /server/scripts] en_US.UTF-8 [root@backup /server/scripts] [root@backup /server/scripts] i am oldboy
3.2 变量类型: 变量可分为两类:环境变量(全局变量)和普通变量(局部变量)
全局变量(环境变量) 针对系统所有用户生效 局部变量(普通变量) 针对当前登录用户生效
变量生存周期分类 两类 临时性 export 声明变量即可 或者 name=oldboy 永久性 修改配置文件 /etc/profile
1 2 3 4 5 6 7 8 9 10 环境变量文件执行顺序 1. /etc/profile 2. .bash_profile 3. .bashrc 4. /etc/bashrc 如果按照文件内容的生效顺序 1. /etc/profile 2. .bashrc 3. /etc/bashrc 4. .bash_profile
3.3 如何定义变量 要求以字母 数字 和下划线组合 只能以字母和_开头 等号两端不允许有空格 名字 见名直其意
1 2 3 4 5 变量名字的定义的语法: OLDBOY_AGE=18 系统用的变量都是大写 oldboy_age=18 全小写 oldboy_Age=18 小驼峰语法 Oldboy_Age=18 大驼峰语法
普通变量定义:
1 2 3 变量名=value 变量名='value' 变量名=“value“
变量值得定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1.数字定义 连续的数字 oldboy=188888 2.字符串定义 连续的字符串 name="oldboy alex lidao" 不知道加什么就加双引号 例子: CODE_DIR=/etc/sysconfig/network-scripts/ name='$oldboy' 所见即所得 不解析变量 [root@backup ~] [root@backup ~] oldboy [root@backup ~] $name 3.命令的定义 方法1 time=`date +%F` 方法2 time=$(date +%F) [root@backup /server/scripts] [root@backup /server/scripts] 2019-08-22-22-02-18 [root@backup /server/scripts] 2019-08-22-22-02-18 [root@backup /server/scripts] [root@backup /server/scripts] 2019-08-22-22-02-28
第4章 特殊的位置参数变量
位置变量
作用说明
$0
获取当前执行的shell脚本的文件名,如果包含路径,则包括脚本路径
$n
获取当前执行脚本的第n个参数值,参数从$1开始 $9 以后需要加{}
$#
获取当前执行的脚本后面接的参数的总个数
$*
获取当前执行脚本所有传参的参数,不加引号和$@相同
$@
获取脚本的所有的参数 不加双引号和$* 相同 加上双引号则把参数视为独立的(在循环体中)
4.1 设置15个参数,用于传递 1 2 3 4 5 6 7 8 9 10 11 12 [root@backup /server/scripts] #!/bin/bash echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@backup /server/scripts] a b c d e f g h i a0 a1 a2 a3 a4 a5 [root@backup /server/scripts] #!/bin/bash echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} [root@backup /server/scripts] a b c d e f g h i j k l m n o
4.2 特殊变量$0 获取脚本名称及路径
1 2 3 4 5 6 7 8 9 10 [root@backup /server/scripts] echo $0 [root@backup /server/scripts] n.sh [root@backup ~] /server/scripts/n.sh [root@backup /server/scripts] /server/scripts [root@backup /server/scripts] n.sh
4.3 特殊变量$# 通过$#获取脚本传参的总个数
1 2 3 4 5 6 [root@backup /server/scripts] echo $1 $2 $3 $4 $5 $6 $7 $8 $9 echo $# [root@backup /server/scripts] a b c d e f g h i 26
案例一
1 2 3 4 5 6 [root@backup /server/scripts] 请重新输入两个参数 [root@backup /server/scripts] ok [root@backup /server/scripts] error
案例二
1 2 3 4 5 6 7 8 9 10 11 12 [root@backup /server/scripts] #!/bin/bash if [ $# -ne 2 ] then echo "USAGE:/bin/bash -bash arg1 arg2" exit 1 fi echo $1 $2 [root@backup /server/scripts] USAGE:/bin/bash -bash arg1 arg2 [root@backup /server/scripts] oldboy 123456
4.4 特殊变量$*和$@ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@backup /server/scripts] [root@backup /server/scripts] I am oldboy teacher [root@backup /server/scripts] I am oldboy teacher [root@backup /server/scripts] I am oldboy teacher [root@backup /server/scripts] I am oldboy teacher [root@backup /server/scripts] I am oldboy teacher [root@backup /server/scripts] I am oldboy teacher
第5章 特殊的位置状态变量
位置变量
作用说明
$?
获取上一个指令的执行状态并返回值(0为成功,非0为失败)
$$
获取当前执行的shell脚本的进程号(pid),脚本名字相同时使用
$!
获取上一个后台工作的进程的进程号(pid) ,调试脚本时使用
$_
获取在此之前执行的命令或脚本的最后一个参数 ,相当于ESE.
5.1 特殊变量$0使用 判断上一个命令是否执行成功,可用于判断服务是否正确执行或命令是否执行成功
当备份数据时,可通过$?来判断是否成功,备份数据是否完整
1 2 3 4 5 6 7 8 [root@backup /server/scripts] /server/scripts [root@backup /server/scripts] 0 [root@backup /server/scripts] -bash: lll: command not found [root@backup /server/scripts] 127
5.2 特殊变量$$使用 获取脚本执行的进程号pid
1 2 3 4 5 6 7 8 9 10 [root@backup /server/scripts]# cat test.sh #!/bin/bash echo $$ > /tmp/test.pid sleep 300 [root@backup /server/scripts]# sh test.sh [root@backup ~]# ps -ef |grep test.sh root 5641 4909 0 09:51 pts/1 00:00:00 sh test.sh root 5667 5643 0 09:51 pts/2 00:00:00 grep --color=auto test.sh [root@backup ~]# cat /tmp/test.pid 5641
5.3 特殊变量$_使用 获取上一条命令的最后一个参数
1 2 3 [root@backup ~] [root@backup /server/scripts] /server/scripts/
5.4 特殊变量$!使用 用于获取上一次执行脚本的pid
第6章 变量传参的三种方法 6.1 直接传参 1 2 [root@backup /server/scripts] oldboy 123456
6.2 赋值传参 1 2 3 4 5 6 7 8 [root@backup /server/scripts] #!/bin/bash url=$1 ping -c 1 $url &>/dev/null [ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error" [root@backup /server/scripts] ping www.qq.com is ok
6.3 read传参 1 2 3 4 5 6 7 8 9 10 11 12 [root@backup /server/scripts] #!/bin/bash read -p "please input url is: " urlping -c 1 $url &>/dev/null [ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error" [root@backup /server/scripts] please input url is: www.qq.com ping www.qq.com is ok [root@backup /server/scripts] please input url is: www.qqq.com ping www.qqq.com is error
6.4 案例 使用三种传参方式 做ping url 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@backup /server/scripts] #!/bin/bash ping -c 1 $1 &>/dev/null [ $? -eq 0 ] && echo "ping $1 is ok" || echo "ping $1 is error" url=$1 ping -c 1 $url &>/dev/null [ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error" read -p "please input url is: " urlping -c 1 $url &>/dev/null [ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error" [root@backup /server/scripts] ping www.qq.com is ok ping www.qq.com is ok please input url is: www.qq.com ping www.qq.com is ok
第7章 变量的子串(常用) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@backup /server/scripts] [root@backup /server/scripts] I am oldboy [root@backup /server/scripts] 11 [root@backup /server/scripts] 11 [root@backup /server/scripts] 11 [root@backup /server/scripts] am [root@backup /server/scripts] am [root@backup /server/scripts] am [root@backup /server/scripts] am
面试题: 统计字符串长度
1 2 3 4 5 6 7 8 9 10 I am oldboy 11 11 11 11
面试题2: 输出字符串长度小于3的单词
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@backup /server/scripts] #!/bin/bash for i in I am lizhenya teacher I am 18do [ ${#i} -lt 3 ] && echo $i done [root@backup /server/scripts] I am I am 18 [root@backup /server/scripts] I am I am 18 [root@backup /server/scripts] I am I am 18
变量子串的删除和替换
1 2 3 4 5 6 7 8 9 [root@backup /server/scripts] I am oldboy [root@backup /server/scripts] [root@backup /server/scripts] am oldboy [root@backup /server/scripts] am
#从前面往后删除 ## 贪婪匹配
%从后往前删除
// 替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@backup /server/scripts] [root@backup /server/scripts] baidu.com [root@backup /server/scripts] com [root@backup /server/scripts] com [root@backup /server/scripts] www.baidu [root@backup /server/scripts] www [root@backup /server/scripts] www [root@backup /server/scripts] www.baidu.com [root@backup /server/scripts] www.qq.com [root@backup /server/scripts] Sww.baidu.com [root@backup /server/scripts] SSS.baidu.com
第8章 变量的数值计算 常见的Shell算术运算符
算术运算符
意义(*表示常用)
+ 、-
加(或正号)、减(或负号)*
*、/、%
乘法、除法、取余 *
**
冥运算 *
++ 、–
增加、减少,可前置也可放在变量的结尾 *
!、&&、||
非(取反)、相当于and 、相当于or *
< 、<= 、> 、>=
比较符号(小于、小于等于、大于、大于等于)
== 、!= 、=
比较符号 (相等、不相等、对于字符串=也可表示相当于)*
<< 、>>
向左移位、向右移位
~ 、| 、& 、^
按位取反、按位异或、按位于、按位或
= 、+=、-= 、*= 、%=
赋值运算符,例如 a+=1 相当于 a=a+1 , a-=1 相当于 a=a-1 *
常见的运算命令
运算操作符号与运算命令
意义
(())
用于整数的运算、效率很高
let
用于证书运算,类似于(())
expr
可用于整数运算,还有其他功能
bc
Linux下的计算程序、可用于整数及小数运算
$[]
用于整数运算
awk
awk既可用于整数运算,也可用于小数运算
declare
定义变量值和属性,-i参数可用于定义整形变量,做运算
8.1 双小括号(())数值运算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@backup /server/scripts] 8 [root@backup /server/scripts] 4 [root@backup /server/scripts] 12 [root@backup /server/scripts] 3 [root@backup /server/scripts] [root@backup /server/scripts] 4 [root@backup /server/scripts] 5 [root@backup /server/scripts] 25
8.2 let数值运算 1 2 3 4 5 6 7 8 9 [root@backup /server/scripts] [root@backup /server/scripts] [root@backup /server/scripts] 11 [root@backup /server/scripts] [root@backup /server/scripts] [root@backup /server/scripts] [root@backup /server/scripts] 30
8.3 expr数值运算 1 2 3 4 5 6 7 8 9 10 [root@backup /server/scripts] 4 [root@backup /server/scripts] 0 [root@backup /server/scripts] expr: syntax error [root@backup /server/scripts] 4 [root@backup /server/scripts] 1
8.4 bc数值运算 1 2 3 4 5 6 7 8 [root@backup ~] 20 [root@backup ~] 20.5 [root@backup ~] 105.0 [root@backup ~] 0
8.5 $[] 数值运算 1 2 3 4 5 6 7 8 [root@backup /server/scripts] 20 [root@backup /server/scripts] 0 [root@backup /server/scripts] 100 [root@backup /server/scripts] 1
8.6 awk数值运算 1 2 3 4 5 6 7 8 [root@backup /server/scripts] 11.5 [root@backup /server/scripts] 8.5 [root@backup /server/scripts] 15 [root@backup /server/scripts] 6.66667
8.7 declare命令的用法 1 2 3 4 [root@backup ~] [root@backup ~] [root@backup ~] 37