主要学习点
- Shell的基本语法结构
如:变量定义、条件判断、循环语句(for、until、while)、分支语句、函数和数组等; - 基本正则表达式的运用;
- 文件处理三剑客:grep、sed、awk工具的使用;
- 使用shell脚本完成一些较复杂的任务,如:服务搭建、批量处理等。
1.SHELL基础
1.1SHELL概念
shell就是人机交互的一个桥梁
shell的种类
[root@MissHou ~]# cat /etc/shells
/bin/sh #是bash的一个快捷方式
/bin/bash #bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有 的功能
/sbin/nologin #表示非交互,不能登录操作系统
/bin/dash #小巧,高效,功能相比少一些
/bin/csh #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷
/bin/tcsh #是csh的增强版,完全兼容csh
1.2SHELL脚本
将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= shell脚本
1.3什么时候用到脚本?
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
1.4shell脚本能干啥?
- 自动化软件部署 LAMP/LNMP/Tomcat…
- 自动化管理 系统初始化脚本、批量更改主机密码、推送公钥…
- 自动化分析处理 统计网站访问量
- 自动化备份 数据库备份、日志转储…
- 自动化监控脚本
1.5shell脚本的基本写法
-
脚本第一行,魔法字符==#!==指定解释器【必写】
#!/bin/bash 表示以下内容使用bash解释器解析
-
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题
2.变量的定义
2.1变量定义
[root@MissHou ~]# A=hello 定义变量A
[root@MissHou ~]# echo $A 调用变量A hello
[root@MissHou ~]# echo ${A} 还可以这样调用 hello
[root@MissHou ~]# A=world 变量可以变
[root@MissHou ~]# echo $A world
[root@MissHou ~]# unset A 重置变量
[root@MissHou ~]# echo $A 空
2.2变量的定义规则
-
变量名区分大小写
-
变量名不能有特殊符号
-
变量名不能以数字开头
-
等号两边不能有任何空格
-
变量名尽量做到见名知意
2.3变量的定义方式
-
2.3.1直接赋值给一个变量
[root@MissHou ~]# A=1234567 [root@MissHou ~]# echo $A 1234567 [root@MissHou ~]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符 3456 说明: **$变量名 和 ${变量名}的异同** 相同点:都可以调用变量 不同点:`${变量名}`可以只截取变量的一部分,而`$变量名`不可以
-
2.3.2命令执行结果赋值给变量
[root@MissHou ~]# B=`date +%F` [root@MissHou ~]# echo $B 2019-04-16 [root@MissHou ~]# C=$(uname -r) [root@MissHou ~]# echo $C 2.6.32-696.el6.x86_64
-
2.3.3交互式定义变量(read)
-
目的:让用户自己给变量赋值,比较灵活。
-
语法:read [选项] 变量名
-
常见选项:
-p定义提示用户的信息 -n 定义字符数(限制变量值的长度) -s 不显示(不显示用户输入的内容) -t 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)
-
举例说明:
用法1:用户自己定义变量值
[root@MissHou ~]# read name //提示用户定义一个name,并输入值 harry [root@MissHou ~]# echo $name harry [root@MissHou ~]# read -p "Input your name:" name Input your name:tom [root@MissHou ~]# echo $name tom
用法2:变量值来自文件
[root@MissHou ~]# cat 1.txt 10.1.1.1 255.255.255.0 [root@MissHou ~]# read ip mask < 1.txt [root@MissHou ~]# echo $ip 10.1.1.1 [root@MissHou ~]# echo $mask 255.255.255.0
-
-
2.3.4定义有类型的变量(declare)
-
目的: 给变量做一些限制,固定变量的类型,比如:整型、只读
-
用法:declare 选项 变量名=变量值
-
常用选项:
-i 将变量看成整数 declare -i A=123 -r 定义只读变量 declare -r B=hello -a 定义普通数组;查看普通数组 -A 定义关联数组;查看关联数组 -x 将变量通过环境导出 declare -x AAA=123456 等于 export AAA=123456
-
举例说明:
[root@MissHou ~]# declare -i A=123 [root@MissHou ~]# echo $A 123 [root@MissHou ~]# A=hello [root@MissHou ~]# echo $A 0 [root@MissHou ~]# declare -r B=hello [root@MissHou ~]# echo $B hello [root@MissHou ~]# B=world -bash: B: readonly variable [root@MissHou ~]# unset B -bash: unset: B: cannot unset: readonly variable
-
-
-
2.4变量的分类
2.4.1本地变量
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
2.4.2环境变量
环境变量:当前进程有效,并且能够被子进程调用。
- env查看当前用户的环境变量
- set查询当前用户的所有变量(临时变量与环境变量)
- export 变量名=变量值 或者 变量名=变量值;export 变量名
2.4.3全局变量
- 全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
- 解读相关配置文件
文件名 | 说明 | 备注 |
---|---|---|
$HOME/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义别名、umask、函数等 |
$HOME/.bash_profile | 当前用户的环境变量,用户登录时读取 | |
$HOME/.bash_logout | 当前用户退出当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
$HOME/.bash_history | 用户的历史命令 | history -w 保存历史记录 history -c 清空历史记录 |
-
说明 :以上文件修改后,都需要重新source让其生效或者退出重新登录。
-
用户登录系统读取相关文件的顺序
/etc/profile $HOME/.bash_profile $HOME/.bashrc /etc/bashrc $HOME/.bash_logout
2.4.4系统变量
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.
内置变量 | 含义 |
---|---|
$? | 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误 |
$0 | 当前执行的程序或脚本名 |
$# | 脚本后面接的参数的个数 |
$* | 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 |
$@ | 脚本后面所有参数,参数是独立的,也是全部输出 |
$1~$9 | 脚本后面的位置参数,$1表示第1个位置参数,依次类推 |
10 {10}~ 10 {n} | 扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字 |
$$ | 当前所在进程的进程号,如echo $$ |
$! | 后台运行的最后一个进程号 (当前终端) |
!$ | 调用最后一条命令历史中的参数 |
3.简单四则运算
算术运算:默认情况下,shell就只能支持简单的整数运算
运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%)
表达式 | 举例 |
---|---|
$(( )) | echo $((1+1)) |
$[ ] | echo $[10-5] |
expr | expr 10 / 5 |
let | n=1;let n+=1 等价于 let n=n+1 |
4.数组
-
4.1数组分类
普通数组:只能使用整数作为数组索引(元素的下标)
关联数组:可以使用字符串作为数组索引(元素的下标)4.1.1普通数组定义
-
一次赋予一个值
数组名[索引下标]=值 array[0]=v1 array[1]=v2 array[2]=v3 array[3]=v4
-
一次赋予多个值
数组名=(值1 值2 值3 ...) array=(var1 var2 var3 var4) array1=(`cat /etc/passwd`) 将文件中每一行赋值给array1数组 array2=(`ls /root`) array3=(harry amy jack "Miss Hou") array4=(1 2 3 4 "hello world" [10]=linux)
4.1.2数组的读取
${数组名[元素下标]} echo ${array[0]} 获取数组里第一个元素 echo ${array[*]} 获取数组里的所有元素 echo ${#array[*]} 获取数组里所有元素个数 echo ${!array[@]} 获取数组元素的索引下标 echo ${array[@]:1:2} 访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素 查看普通数组信息: [root@MissHou ~]# declare -a
-
4.2.1普通数组定义
-
首先声明关联数组
declare -A asso_array1
-
数组赋值
-
一次赋一个值
数组名[索引or下标]=变量值数组名[索引or下标]=变量值 # asso_array1[linux]=one # asso_array1[java]=two # asso_array1[php]=three
-
一次赋多个值
# asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="Miss Hou")
-
查看关联数组
# declare -A declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )' declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss Hou" )'
-
获取关联数组值
# echo ${asso_array1[linux]} one # echo ${asso_array1[php]} three # echo ${asso_array1[*]} three two one # echo ${!asso_array1[*]} php java linux # echo ${#asso_array1[*]} 3 # echo ${#asso_array2[*]} 4 # echo ${!asso_array2[*]} name3 name2 name1 name4
-