shell阶段总结

shell脚本编程学习概述

学习shell脚本原因
①提升工作效率
②减少重复性工作
③完成批量操作
④节省人力成本
学习shell脚本必备知识
熟练使用编辑软件vim
熟练使用常用命令 150个常用命令 三剑客命令
熟练使用系统符号 (系统常用符号 系统通配符 系统正则符号)
学习shell方法技巧
看脚本
模仿会写
高手核心 量的积累 产生质的变化
学习服务 依赖高手,拿来主义

shell脚本学习基础知识
什么是shell shell其实一种命令解释器
centos系统默认shell默认就是bash
什么是shell脚本
编写大量命令文件(堆命令)
含有循环和判断语句的文件
扩展名称为.sh的结尾的文件
通过file命令进行判断文件是否是脚本

shell脚本编写创建说明
脚本创建编写说明
统一脚本存放目录
推荐使用编辑软件vim
编写脚本格式说明
①开头编写解释器信息 #!/bin/bash
②开头编写脚本的注释 author data version desc

shell脚本编写详细说明

变量是什么 未知数==变量
用更多固定字符串,替换更多复杂内容

变量的分类

全局变量(环境变量)
概念定义:系统默认定义好的,由大写字母组成,哪里都可以使用
分类说明:
内置环境变量 shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等
LANG、PATH、PATH、UID等
通过env命令可以查看系统内置环境变量

自定义环境变量 建议所有环境变量都是大写
必须使用export命令定义 export LSY=1
取消变量 unset LYS
永久生效 /etc/profile

环境变量相关文件
全局环境变量配置文件 /etc/profile /etc/bashrc /etc/profile.d(用户登录到系统、会运行这个目录下面的脚本、脚本要有执行权限、用户登录系统后运行cowsay.sh)
用户环境变量配置文件 (~/.bash_profile ~/.bashrc)

局部变量(普通变量)

概念定义:只能创建他们的shell函数或者shell脚本中使用
定义变量 变量名称=value
value:可以使用命令定义变量 (info=$(date + %F) info=date + %F)
value:可以使用字符定义变量值
01.数字、字母以及下划线组成
02.可以字母以及下划线开头
03.进行变量赋值时,等号两边不能存在空格
value:可以使用引号定义变量值(双引号 可以解析变量信息 单引号:表示所见即所得)

命令要求:命令变量字符信息 (字母 数字:一定不能是数字开头 下划线 见名知其意)
命令变量特殊语法:驼峰语法 首个字母小写 ,其余单词首字母大写

变量调用 调用方式 (直接输出信息 echo $变量名称)
用于计算调用 declare let

调用问题:典故金庸新 著 ${WEEK}DAY

特殊变量 (进程状态)
定义变量 awk -v 参数进行计算
awk -vn1=3 -vn2=5 ‘BEGIN{print n1 +n2}’
cal.sh
加减乘除

位置变量

$0 位置变量说明:获取当前执行的shell脚本的文件名
如果执行脚本带路径那么就包括脚本路径
模拟系统使用$0
位置变量命令:
dirname
basename

$n 位置变量说明:获取当前执行的shell脚本的第n个参数值,n=1…9…
参数默认以空格隔开
当n为0时表示脚本的文件名
如果n大于9就用大括号括起来,例如{10}
$#
位置变量说明 获取当前执行的shell脚本后面接的参数的总个数
$*
位置变量说明:获取传输的参数信息,以整体方式进行获取
位置变量命令 set "i am "oldboy teacher
循环语句识别:for i in $;do echo i;doneforiin"i;done for i in "";do echo $i;done
[email protected]
位置变量说明:获取传输的参数信息,以个体方式进行获取
位置变量命令 set “i am"oldboy teacher
循环语句识别:for i in [email protected];do echo i;doneforiin"i;done for i in "@”;do echo $i;done

进程变量

$? 进程状态变量说明
获取执行上一个指令的返回值
0为成功 非零为失败
生产环境使用场景 用于判断命令程序是否执行成功

$$ 进程状态变量说明 获取当前脚本执行的进程号,主要用于管理守护进程脚本
$! 进程状态变量说明 获取上一个后台运行脚本的进程号信息
$_ 进程状态说明: 获取上一个执行脚本的最后一个参数信息

变量的定义
①直接赋值
②脚本传参
③交互设定 read -p(read 得到的输入默认存储在变量REPLY 存储在一个指定变量中 存储在多个变量中 read -p"提示语句",则屏幕就会输出提示语句) -t等到时间 -s 关闭回显 ,用于密码输入

案例01 编写修改主机名和IP地址的脚本
案例02 编写测试域名访问的脚本

变量的扩展
变量子串(变量扩展)
$ {parameter} 等价于返回变量 $parameter的内容信息
$ {#parameter} 等价于返回变量 $parameter 内容的长度信息,是按照字符信息统计,也适用于特殊变量
$ {parameter:offset} 在变量 $ parameter中,从offset位置之后进行取值 一直到结尾
$ {parameter:offset:length} 在变量 $parameter中,从offset位置进行取值,取length长度的字符串信息
$ {parameter#word} 从字符串开始进行匹配word字符穿信息,删除最短匹配的word信息
$ {parameter##word} 从字符串开始进行匹配word字符串信息 删除最长匹配的子串word信息
$ {parameter%word} 从字符串结尾进行匹配word字符信息,删除最短匹配的子串word信息
$ {parameter/string/replace} 使用replace字符串替换第一个匹配的string字符串信息
$ {parameter//string/replace} 使用replace字符串替换所有匹配的string字符串信息

$(value:-word) 当变量未定义或者数值为空时,返回值为word内容,否则返回变量的值
$(value:?“word”) 定义一个变量如果存在时,输出变量值;定义变量不存在时,利用bash显示指定报错信息
$(value:+word) 当变量数值为空或者为赋值,否则什么都不做,否则word字符将替代变量的值
$(value:=word) 若变量未定义或者值为空时,在返回word值的同时将word赋值给value

脚本变量数值计算

shell阶段总结
shell阶段总结

算数运算命令说明:
整数运算方法

() 直接运算输出
echo $((i+1))
变量运算输出
i= $ (1+5);echo $i
i=1;((i=i+5));echo $i

let 变量输出
i=1;let i=i+9;echo $i

declare 变量运算输出 a=5;declare -i a+=10;echo $a

expr 直接运算输出 expr 1+1

企业扩展应用

基本运算功能 a=1;b=expr $a +4;echo %b
判断是否整数 a=123;expr $a+1 >/dev/null 2>&1;echo $?
判断字符长度 char=“i am oldboy”;expr length " $char"
判断扩展名称 if expr " $1":".*.txt" >/dev/null
进行数字比较 expr 1<2
比较结果 成立 返回1
比较结果错误 返回0

$[] 直接运算输出 echo $[1+2]
bc 直接运算输出 echo 1+2|bc
echo 1.1 +2.1 |bc

awk 直接运算输出
echo 1.1 2.2 |awk ‘{print $1+$2}’
echo 1.1 2.2 |awk ‘{print$1 + $2}’
变量运算输出
awk ‘{sum=sum+$0}END{print sum}’
echo {1…10}|awk ‘{for(i=1;i< $NF;i++) sum+= $i}END{print sum}’

逻辑判断语句

条件语句种类说明
1条件语句语法 if [条件] ;then 命令 else 命令 fi

if 条件语句扩展
单分支条件语句
语法 if [条件];then 命令 fi
双分支语句
语法 if[条件];then 命令 else 命令 fi

多分支条件语句 if [条件];then 命令 elif [条件] ;then 命令 ;else 命令 fi

交互式比较两个整数信息大小
实现编写菜单功能进行选择信息

2)条件语句语法 test <测试表达式>
3) 条件语句语法 <测试表达式>
条件语句使用方法–成功以后执行响应操作
[测试表达式] && echo 1
条件语句使用方法–失败之后执行相应操作
[测试表达式] || echo 1
条件语句使用方法–执行操作需要多条命令
[测试表示式] && {操作命令信息}
[测试表示式] || {操作命令信息}
条件语句使用方法–正确错误都执行操作
[测试表达式] && echo 0|| echo 1
[测试表达式] && {echo 0}|| {echo 1}

[[<测试表达式>]]
((<测试表达式>))
(<测试表达式>)
<测试表达式>

测试表达式书写

文件测试表达式
字符串测试表达式
整数测试表达式
逻辑测试表达式

结构条件语句说明
case条件语句说明: 相当于多分支的if/ else 条件语句 ,但是它比这些条件语句看起来更规范工整

case结构条件语句语法 esac
case语句执行流程

case结构语句测试练习 测试case语句打印水果菜单信息

case结构语句知识扩展
设置字符颜色信息

设置字符背景颜色
(这里就不写了,详细见我之前的一个博客,shell脚本中输出字符颜色设置)

逻辑循环语句
for循环
概念说明 for循环语句主要用于执行次数有限的循环;而不是用于守护进程以及无线循环
语法说明:根据变量数值进行循环 for 变量名 in 变量取值列表;do 指令;done

根据判断条件进行循环 for ((expr1;expr2;expr3));do 指令;done

while 循环语句
循环输出数值信息
循环读取文件内容

脚本函数功能

脚本函数概念
将重复应用的命令代码设定一个别名,便于直接调用
脚本函数作用
相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率
增加程序的可读性 易读性 提升管理效率
实现程序功能模块化 使得程序具备同用性(可移植性)

脚本函数语法
标准语法格式 function 函数名(){}
funciton 函数名{}
函数名(){}

脚本函数调用

① 调用函数时,函数名前的function和函数名后的小括号都不要带
②函数的定义必须要在执行的程序前面定义或者加载
③ shell执行系统中个程序顺序,系统别名—函数–系统命令—可执行文件
④ 函数执行时,会和调用他的脚本共用变量,也可以为函数设置局部变量以及特殊位置参数
⑤ 在shell函数里面,return命令的功能与exit类似,return的作用是退出函数,而exit是退出脚本文件
⑥return 语句会返回一个退出值给调用函数的当前程序,而exit会返回一个退出值给执行程序的当前shell
⑦如果将函数存放在一个独立的文件中,被脚本加载使用是,需要使用source或者"."来加载
⑧ 在函数内一般使用local定义局部变量,这些变量离开函数后就会消失

脚本函数传参

①shell的位置参数 ($1 $2 $# $* $? [email protected])都可以作为函数的参数来使用
②此时父脚本的参数临时地被函数参数所掩盖或隐藏
③$0 比较特殊,仍然是父脚本的名称
④当函数执行完成时,原来的命令行脚本的参数即可恢复
⑤函数的参数变量是在函数体里面定义的

脚本函数分离
将编写的函数信息放入到指定的函数文件库中,进行加载函数库文件,实现哈数信息分离

函数定义变量
脚本和函数同时定义变量 ,各自调用使用自己的变量信息
脚本中函数中一方定义变量,各自调用使用对方的变量信息

函数的返回值 根据return返回值信息,判断函数命令是否执行正确

调试测试脚本
sh -x 脚本

shell脚本编程扩展说明
shell脚本控制指令
循环控制指令

break n 表示跳出循环的层数,如果省略n,表示跳出整个循环
continue n n 表示退出到第n层循环,如果省略n,则表示跳出本次循环,忽略本地循环的剩余代码

退出脚本指令
exit n 退出当前shell程序;n为上一次程序执行的状态返回值,n可以忽略,在下一个shell里面可以通过$?接受exit n的n值

return 用于函数里作为函数的返回值,以判断函数执行是否正确,在下一个shell里可以通过$?接受return n的值

shell脚本数组概念

shell 数组概念介绍

数据就是元素的集合,把有限个元素用一个名字来命名,然后用编号对它们进行区分
元素集合的名称,就成为数组名
用于区分不同内容的编号就称为数组下标
组成数组的各个元素称为数组的元素,有时称为下标变量

shell数组作用说明 可以将多个变量信息进行汇总定义,避免单独定义的麻烦

shell数组实践说明

shell数组定义
array=(a b c)
array=([1]=one [2]=two [3]=three)
array=[0]=lsy

arra=(命令信息)

shell数组调用

查看数组所有元素信息
echo $(array[*])
echo $(array [@])

查看数组指定元素信息
echo ${array[n]}
echo ${#array[*]}
echo ${!array[@]}