关于shell编程基础:
1.为什么要学习shell编程?
Linux系统中会大量的使用Shell,工作中我们也需要自动化实现业务。
Web集群架构会用到shell编程基础。
例如: 自动备份,监控,自动安装服务。
Shell编程是Linux运维人员必须要会的编程语言。最简单的编程语言。
编程也是运维人员必须具备的本领:
shell、python是运维人员必须具备的本领。
------------------------------------------------------------------------------------------------------
2.什么是shell?
shell 就是一个命令解释器(翻译官),,它在操作系统的最外层,负责直接与用户进行对话,
将用户输入的命令翻译给操作系统,并将处理的结果输出至屏幕。
当然shell命令存在交互式、和非交互式的两种方式。
交互式:就是日常使用最多的一种模式、登录终端、执行命令、返回结果。
再次输入命令,然后等待结果。最后结束工作退出shell会话。当退出shell会话后,
当前的shell会话也就终止了。
非交互式:在这种模式下,shell不与你进行交互,而是直接读取某个文件进行
执行。那文件中都有什么,“其实就是一些命令”。当然文件从头执行到结尾,结束后,
当前shell也就终止了。
------------------------------------------------------------------------------------------------------
3.什么是shell脚本?
1)将系统命令椎积在一起,顺序执行(系统命令椎积).
2)特定的格式+特定的语法+系统的命令=文件
4.shell脚本能做什么(shell其实就是基于标准之上的-->脚本工具)
1)基础配置:系统初始化操作、系统更新、内核调整、网络等
2)安装程序:部署LNMP、LAMP、MySQL、Nginx、Redis
3)配置变更:Nginx Conf、PHP Conf、MySQL Conf、Redis Conf
4)业务部署:
5)日常备份:
6)信息采集
7)日志分析:取值-->排序-->去重-->统计-->分析
8)服务扩容:
9)服务缩容:
注意:shell脚本主要的作用是简化步骤,提高效率,减少人为干预,
减少系统故障。
------------------------------------------------------------------------------------------------------
5.shell 规范
1)脚本存放在固定的目录/script
2)开头加!/bin/bash 作用:告诉脚本使用的是那种命令解释权器。
如,不指shell,默认以bash执行。
3)附带作者及版权信息。
4)脚本扩展名为 *.sh
5)脚本中不用中文。
6)成对的符号一次书写完成
7)循环格式一次性输入完成。
------------------------------------------------------------------------------------------------------
6.执行方式:
bash test.sh 无需权限,直接调用解释器翻译
./test.sh 需要权限,同时需要定义对应的解释器,不定义默认bash
#!/usr/bin/bash
脚本中如果不写,在执行的过程中如果./方式执行(需要权限),
默认调用bash命令翻译该文件。
脚本中如果写了使用什么解释器翻译,那在使用./时则会调用对应的解释器执行。
7.shell 变量
1)什么是变量
变量是shell传递数据的一种方法,简单解释:就是用一个固定的字符串去
表示不固定的值,便于后续的引用。
2)命名规范
字母、数字、下划线几个组成,尽量字母开头(变量名最好是具备
一定的含义)
3)定义方式
1.自定义变量:人为定义变量名称。
2.系统环境变量:保存的是和系统操作环境相关的数据
3.位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。
4.预定义的变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
eg1:用户自定义变量示例,当前shell有效
[root@test shell]# var="hello shell"
hello shell
eg2:引用变量,$变量名 或 ${变量名}
[root@test shell]# echo $var_log
hello shell_log
小总结:
1.在定义变量的时候,比如:var="$(hostname)"
2.在引用变量的时候,尽可能的使用双引号 echo "$var"
3.在我们使用echo输出的时候,如果输出的字符串中有特殊的符号,
建议使用单引号 echo '#$123'
------------------------------------------------------------------------------------------------------
4)使用系统已定义好的环境变量
1.简单的使用一下系统的变量,当然也可以使用export打印当前系统所有的环境变量
[root@test shell]# cat env.sh
#!/bin/bash
echo "用户的家目录:$HOME"
echo "当前主机名是:$HOSTNAME"
echo "当前所在目录:$PWD"
echo "当前连接服务器使用的地址和端口是:$SSH_CONNECTION"
2.如果系统的环境变量不满足要求,可以自定义:
(1)定义环境变量:export变量,将自定义变量转换成环境变量
[root@test shell]# var2=hello
[root@test shell]# echo $var2
hello
[root@test shell]# cat a.sh
#!/bin/bash
echo $var2
[root@test shell]# sh a.sh #执行a.sh时,会使用另一个bash去执行,
就访问不到$var2 的值
[root@test shell]# export var2=hello #将变量转化为环境变量
[root@test shell]# sh a.sh #再次执行脚本
hello
------------------------------------------------------------------------------------------------------
5)预先定义变量参数示例,系统内置变量的使用方法
需要注意$* 和 $@ 区别:
1.脚本如下:
[root@test shell]# cat variable.sh
#!/bin/bash
echo "#当前shell脚本的文件名:$0"
echo "#第1个shell脚本位置参数:$1"
echo "#第2个shell脚本位置参数:$2"
echo "#第3个shell脚本位置参数:$3"
echo "#所有传递的位置参数:$*"
echo "#所有传递的位置参数:$@"
echo "#总共传递的参数个数是:$#"
echo "#当前程序运行的PID是:$$"
echo "#上一个命令执行的返回结果:$?"
[root@test shell]# sh variable.sh 11 22 33 44 55 66
#当前shell脚本的文件名:variable.sh
#第1个shell脚本位置参数:11
#第2个shell脚本位置参数:22
#第3个shell脚本位置参数:33
#所有传递的位置参数:11 22 33 44 55 66
#所有传递的位置参数:11 22 33 44 55 66
#总共传递的参数个数是:6
#当前程序运行的PID是:21293
#上一个命令执行的返回结果:0
------------------------------------------------------------------------------------------------------
例子:
#!/bin/bash
test(){
echo "末加引号,二者相同"
echo $*
echo $@
echo "加入引号后对比"
echo "---"\s*---""
for N in "$*"
do
echo $N
done
echo "---"\$@---""
for N in "$@"
do
echo $N
done
}
test 11 22 33
------------------------------------------------------------------------------------------------------
[root@test shell]# sh tt.sh
末加引号,二者相同
11 22 33
11 22 33
加入引号后对比
---$*---
11 22 33
----$@---
11
22
33
------------------------------------------------------------------------------------------------------
总结:可以看见不加引号时,二者都是返回传入的参数,但是加了
引号后,此时$a把参数作为一个字符串整体(单字符串)返回,
$@把每个参数作为一个字符串返回
------------------------------------------------------------------------------------------------------
6)补充:将命令执行的结果传递给变量.(命令替换)
#根据系统时间,打印几年时间和明年时间
[root@test shell]# echo "This is $(date +%Y) year"
This is 2019 year
[root@test shell]# echo "This is $((date +%Y)+1) year"
This is 2020 year
===================================================