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) 脚本内有作者信息 脚本信息
1 | #Date: 20111111 |
5) 每段代码块有注释(尽量使用英文)
6) 标点符号 (语法尽量一次性书写完毕
7) 成对的符号 一次性书写完毕
2.5 第1个Shell脚本
1 | [root@backup /server/scripts]# cat hello.sh |
执行脚本的三种方法:
1 | #方法1:直接使用解释器执行 |
1 | if 条件内容 |
一次性完成for循环语句格式
1 | for |
第3章 Shell变量
3.1 什么是变量?
1 | [root@backup /server/scripts]# echo $LANG |
3.2 变量类型:
变量可分为两类:环境变量(全局变量)和普通变量(局部变量)
全局变量(环境变量) 针对系统所有用户生效
局部变量(普通变量) 针对当前登录用户生效
变量生存周期分类 两类
临时性 export 声明变量即可 或者 name=oldboy
永久性 修改配置文件 /etc/profile
1 | 环境变量文件执行顺序 |
3.3 如何定义变量
要求以字母 数字 和下划线组合 只能以字母和_开头 等号两端不允许有空格 名字 见名直其意
1 | 变量名字的定义的语法: |
普通变量定义:
1 | 变量名=value #赋值时不加引号 |
变量值得定义:
1 | 1.数字定义 连续的数字 oldboy=188888 |
第4章 特殊的位置参数变量
位置变量 | 作用说明 |
---|---|
$0 | 获取当前执行的shell脚本的文件名,如果包含路径,则包括脚本路径 |
$n | 获取当前执行脚本的第n个参数值,参数从$1开始 $9 以后需要加{} |
$# | 获取当前执行的脚本后面接的参数的总个数 |
$* | 获取当前执行脚本所有传参的参数,不加引号和$@相同 |
$@ | 获取脚本的所有的参数 不加双引号和$* 相同 加上双引号则把参数视为独立的(在循环体中) |
4.1 设置15个参数,用于传递
1 | [root@backup /server/scripts]# cat n.sh |
4.2 特殊变量$0
获取脚本名称及路径
1 | [root@backup /server/scripts]# cat n.sh |
4.3 特殊变量$#
通过$#获取脚本传参的总个数
1 | [root@backup /server/scripts]# cat n.sh |
案例一
1 | [root@backup /server/scripts]# [ $# -eq 2 ] || echo "请重新输入两个参数" |
案例二
1 | [root@backup /server/scripts]# cat n.sh |
4.4 特殊变量$*和$@
1 | [root@backup /server/scripts]# set -- "I am" oldboy teacher |
第5章 特殊的位置状态变量
位置变量 | 作用说明 |
---|---|
$? | 获取上一个指令的执行状态并返回值(0为成功,非0为失败) |
$$ | 获取当前执行的shell脚本的进程号(pid),脚本名字相同时使用 |
$! | 获取上一个后台工作的进程的进程号(pid) ,调试脚本时使用 |
$_ | 获取在此之前执行的命令或脚本的最后一个参数 ,相当于ESE. |
5.1 特殊变量$0使用
判断上一个命令是否执行成功,可用于判断服务是否正确执行或命令是否执行成功
当备份数据时,可通过$?来判断是否成功,备份数据是否完整
1 | [root@backup /server/scripts]# pwd |
5.2 特殊变量$$使用
获取脚本执行的进程号pid
1 | [root@backup /server/scripts]# cat test.sh |
5.3 特殊变量$_使用
获取上一条命令的最后一个参数
1 | [root@backup ~]# cd /server/scripts/ |
5.4 特殊变量$!使用
用于获取上一次执行脚本的pid
第6章 变量传参的三种方法
6.1 直接传参
1 | [root@backup /server/scripts]# sh n.sh oldboy 123456 |
6.2 赋值传参
1 | [root@backup /server/scripts]# cat ping.sh |
6.3 read传参
1 | [root@backup /server/scripts]# cat ping.sh |
6.4 案例 使用三种传参方式 做ping url
1 | [root@backup /server/scripts]# cat ping.sh |
第7章 变量的子串(常用)
1 | [root@backup /server/scripts]# test="I am oldboy" |
面试题: 统计字符串长度
1 | # echo $test |
面试题2: 输出字符串长度小于3的单词
1 | [root@backup /server/scripts]# cat for.sh |
变量子串的删除和替换
1 | #截取从第二个字符之后的内容,不包含第二个字符 |
#从前面往后删除 ## 贪婪匹配
%从后往前删除
// 替换
1 |
|
第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 | [root@backup /server/scripts]# echo $((6+2)) |
8.2 let数值运算
1 | [root@backup /server/scripts]# sum=10 |
8.3 expr数值运算
1 | [root@backup /server/scripts]# expr 2 + 2 |
8.4 bc数值运算
1 | [root@backup ~]# echo 10+10|bc |
8.5 $[] 数值运算
1 | [root@backup /server/scripts]# echo $[10+10] |
8.6 awk数值运算
1 | [root@backup /server/scripts]# echo "10 1.5"|awk '{print $1+$2}' |
8.7 declare命令的用法
1 | [root@backup ~]# declare -i A=30 B=7 |