2023年8月2日发(作者:)
Shell编程1、shell 概述A、是什么?shell 是⼀门计算机语⾔,和 python | Java ⼀样,都可以编写程序A-1、shell字⾯意思: 壳(相对核⽽⾔),核:指操作系统,shell 是保护操作系统的A-2、计算机操作系统只能识别 0 和 1 组成的机器码,现在我们是通过GUI|CLI 来间接操作操作系统 GUI(图形化界⾯) | CLI(命令⾏) 在⽤户与操作系统之间,相当于桥梁、中介的作⽤,结构上看,GUI和CLI 保护操作系统A-3、GUI 与 CLI 就是通过 Shell 实现的B、为什么?通过shell按照需求编写⼀些程序C、怎么⽤?(linux)C-1、分类 第⼀类:GUI样式的shell 第⼆类:CLI样式的shell(重点) 专指: Linux 下的 shell 编程
C-2、流程 1)、创建⼀个⽂本⽂档,后缀名是 .sh ⽂档名要做到见名知意 2)、再在⽂本⽂件中录⼊⼀个命令 echo "xxxx" 在命令⾏模式下直接输出数据 规范:第⼀⾏固定格式,这是解释器声明: #!/bin/bash 作⽤:指定脚本解析的解释器 3)、执⾏ .sh ⽂件(.sh⼜称为shell 脚本,⾥⾯放DOS命令) ⽅式1: sh(bash) shell⽂件 ⽅式2: 绝对路径(/xxx/yyy/) 或 相对路径(./),注意:开启所有权限 chmod 777 ⽅式3: source (source 相当于 ./)D、练习练习1:在命令⾏输出当前所在⽬录:pwd2、shell 语法: 注释A、是什么?注释是程序中⾮功能性说明⽂本B、为什么?增强程序的易读性,易维护性C、怎么⽤?注释量占到代码总量的 30% -- 50%单⾏注释(常⽤):⼀次只注释⼀⾏格式: # 注释⽂本多⾏注释(了解,基本不⽤):⼀次可以注释多⾏:<<⾃定义的标记 第⼀⾏注释 第⼆⾏注释 .....⾃定义标记3、shell 语法: 变量A、是什么?程序=数据+数据操作变量就是数据的载体,变量之所以称之为变量,是因为其中的值可以改变B、为什么?变量为数据设置⼀个引⽤,以后再使⽤这个数据时,可以通过引⽤获取数据C、怎么⽤?(重点)变量创建: 格式: 变量名="变量值" 注意1:变量名 a)、不能数字开头 b)、变量名不能有空格这种特殊字符 c)、起名做到见名知意 d)、变量名不要使⽤关键字 注意2:赋值符号 =左右两侧不要有空格 注意3:变量值 a)、变量值可以不使⽤引号,但是如果有空格,必须使⽤ "xxx" 或者 'xxx' b)、"xxx" 和 'xxx' 的区别,变量之间赋值时,如果是 变量2="${变量1}",那么赋的是变量1的值 如果是 变量2='${变量1}' 只是赋值了变量1的调⽤格式,就是echo ${变量2} 返回的是${变量1},⽽不是变量1的值变量查询: 格式:"${变量名}" ----- 标准格式 注意:其他格式(不建议使⽤):${变量名} 或者 $变量名变量修改: 格式:同变量新增变量删除: 格式:unset 变量名D、变量分类D-1、本地(局部)变量 只有当前 shell 可以使⽤的变量D-2、全局变量(静态变量)(了解) 被多个 shell 共享的变量 需求:如何将本地变量转换成全局变量 思想:将本地变量设置为全局变量就是要将本地变量导出到共享空间 格式: export 局部变量 查询全局变量: env 注意1:如果是全局变量,建议变量名所有字母都⼤写 注意2:全局变量要慎⽤D-3、内置变量(特殊变量) 需求:编写shell动态获取某个⽬录下的⼦级(要获取的⽬录不⼀定) 实现流程: 1)、shell 调⽤时,可以传⼊要操作的⽬录 格式: sh 某个⽬录 2)、shell 执⾏时,可以获取调⽤传⼊的⽬录 格式:ls $1 (代表传⼊的第⼀个参数)上述流程其实就是传参以及参数解析的过程,这个参数就可以称之为内部变量特殊变量语法总结: 应⽤场景,程序执⾏时有些数据是可变的,可以调⽤脚本时,传⼊这些可变数据,脚本中解析获取 调⽤格式: sh 参数1 参数2 参数3 ..... 解析格式: $N 获取第 N 个参数 优 点: 动态传值,更灵活 注 意: $N 获取第 N 个参数,但是 N 最⼤就到 9 $0 获取脚本⽂件名 $* 获取所有参数 $# 获取参数个数D-4、扩展:读取键盘录⼊ 需求:编写shell动态获取某个⽬录下的⼦级(⽬录不⼀定,要让调⽤者指定) 格式: read_ -p_"提⽰语句:"_变量名 (注意:_是空格) 作⽤:执⾏到此时,程序挂起,等待⽤户录⼊数据,录⼊数据后,回车,录⼊的数据会赋值给变量 优点:动态获取数据,更灵活E、变量特殊赋值(记住)需求:将某个命令的结果赋值给⼀个变量格式:变量名=`命令`F、练习练习1:使⽤shell脚本,输出当前所在的⽬录知识点:将命令结果赋值给变量练习2:计算/etc⽬录下有多少个⽂件,⽤shell脚本实现新知识点:获取某个⽬录下⼦级个数固定格式:ls ⽬录 | wc -l练习3:实现统计⽤户指定⽬录下的⽂件个数,⽤ shell 脚本实现知识点:怎么动态获取数据?(特殊变量或者读取键盘录⼊)4、shell 语法: 运算符A、是什么?是变量执⾏运算时使⽤的⼀些特殊符号B、为什么?因为程序中频繁使⽤算数运算、逻辑运算、⽐较运算....等算法C、怎么⽤?运算符分类C-1、算数运算符 格式: $((数学表达式)) 运算符: + - * / % ----> 加减乘除取余 注意: ⼀般计算机语⾔中除法运算只取商C-2、⽐较运算符:返回的是 boolean 值(特殊: 0为true 1为false) 格式: [ 表达式 ] ---- 注意:[] 中有两个空格,两个空格中添加表达式 查看结果: $? 运算符: 不能直接使⽤ > < >= <= == != 使⽤对应的参数 -gt(>) -lt(<) -ge(>=) -le(<=) -eq(==) -ne(!=) 记住 g = greater t = than l = less e = equals n = notC-3、逻辑运算符:返回 boolean 值(特殊: 0为true 1为false) 格式: [ 表达式 ] 查看结果: $? 运算符: -a 与-o或 !⾮C-4、字符串⽐较:返回 boolean 值 格式: [ 表达式 ] 查看结果: $? 运算符: == 判断两个字符串内容是不是⼀样 != 判断两个字符串内容是不是不⼀样 -z 判断单个字符串长度是不是0(判断字符串是不是空)C-5、⽂件判断:返回 boolean 值 格式: [ 表达式 ] 查看结果: $? 运算符:-d: 判断是不是⽂件夹 -f: 判断是不是⽂件 -e: 判断是不是存在 变体: test -参数 路径 等价于 [ -参数 路径 ] 例如:test -d ${myDir} 等价于 [ -d ${myDir} ]D、练习练习1:判断 /home/admin(/root)⽬录是否为空思路:现获取⽬录⼦级⽂件个数,判断是否⼤于 0练习2:通过⽤户输⼊任意⽬录判断是否为空5、shell 语法: 函数(⽅法)A、是什么?程序=数据+数据操作变量是数据的载体,函数是数据操作的载体,是程序中最⼩的功能(封装)单元,在函数中⼀般会封装⼀个具有特定功能的实现B、为什么?优点1:代码结构更规整,易维护 易读优点2:实现了功能复⽤C、怎么⽤?C-1、函数声明function(可选) 函数名(){ 函数体}C-2、函数调⽤函数名C-3: 注意1、函数不调⽤不执⾏(所有计算机语⾔通⽤)2、顺序上必须先声明再调⽤(弱类型计算机语⾔的特点)C-4、函数分类类型1:⽆参数⽆返回值类型2:有参数 声明语法:获取参数使⽤ $N : 获取第 N 个参数,N必须⼩于等于 9 $0:脚本⽂件名 $*:所有参数 $#:参数个数 调⽤语法:参数传递 函数名 参数1 参数2 ..... 如下图:函数声明与调⽤类型3:有返回值(了解) 声明语法: 函数名(){ .... return xxx; } 调⽤语法: 函数名 $? 查看结果 注意:函数的返回值在 shell 中两种: return 0 : 函数调⽤正常 ⾮0 : 函数执⾏有误 在shell中的函数中的变量在⼤括号外⾯也能调⽤D、练习练习1:读取键盘录⼊,录⼊长⽅形的长和宽,编写求周长和⾯积的函数,调⽤并输出周长和⾯积的值求长⽅形周长和⾯积6、shell 语法: 流程控制(重点)A、是什么?就是控制代码的执⾏顺序,让代码实现分⽀或循环执⾏B、为什么?组织多样的业务逻辑C、分类?分⽀: if + case循环: for + while7、shell 语法:流程控制分⽀实现之 ifA-1、格式1(单分⽀)语法: if [ boolean表达式 ] then fi举例:(需求: 录⼊年龄,判断是否成⼈,如果成⼈了输出"成年⼈")A-2、格式2(双分⽀)语法: if [ boolean表达式 ] then else fi举例:(需求: 录⼊年龄,判断是否成⼈,如果成⼈了输出"成年⼈",否则输出未成年)A-3、格式3(多分⽀)语法: if [ boolean表达式 ] then elif [ boolean表达式 ] then elif 可以出现多次 else fi举例: (需求: 录⼊年龄,如果⼩于18岁,输出未成年,如果⼤于等于18岁⼩于等于30岁,输出青年,如果⼤于30岁⼩于50岁,输出中年,否则,输出⽼年)B、练习练习1:判断⽤户输⼊的⽤户名和密码是否为admin 123456,如果是则提⽰登录成功,否则提⽰失败知识点:if else +运算符练习2:输⼊数字,判断是否⼤于0,如果⼤于0则将该数字-1并输出,否则+1输出练习3:判断⽤户输⼊的⽬录是否存在,如果存在则统计⽬录下的⽂件个数,否则提⽰⽤户该⽬录不存在练习4:判断学⽣的成绩,⼤于90-100提⽰优秀,80-90之间提⽰良好,70-80之间则提⽰⼀般,60-70之间提⽰ 及格。其他则提⽰不及格练习5:判断⽤户输⼊的内容是否为空,为空则提⽰,不为空则判断是否为⽬录,不为⽬录则判断是否为⽂件,否则提⽰错误信息知识点:多分⽀8、shell 语法:流程控制分⽀实现之case(了解)A、格式语法: case 变量(⽤户输⼊的数据) in 值1) code;; 值2) code;; 值3) code;; ..... *) code;; esac举例:(需求:模拟游戏级别选择,读取键盘录⼊的数字,如果是数字1,那么输出简单, 如果是数字2,那么输出⼀般,如果是数字3输出困难,其他输出数据有误)注意: 1、case 能实现的 if elif 也能实现 2、if elif 能实现的,case不⼀定能实现了 3、语法上 if elif 更简单 4、但case执⾏效率⾼B、练习练习1:输⼊⼀个序号,判断该⽤户选择哪款产品,A:笔记本 B:电饭煲 C:⼩台灯练习2:请输⼊对客服的满意度,【0-3】不满意,【4-6】满意,【7-9】⾮常满意 (了解)case 也可以执⾏区间判断,但是区间范围局限于: 0 - 9区间格式 :[开始数字-结束数字]9、shell 语法:流程控制循环实现之forA、格式语法: for 变量名 in 列表(v1 v2 v3 ......) do #循环体 done举例:(需求:遍历(迭代) 1-10之间所有整数)for循环B、注意seq 命令优化 for 循环格式1: seq 参数NUM ---> 默认遍历 [1-NUM] 之间的所有整数 例如:for ele in `seq 15`......格式2: seq 参数NUM1 参数NUM2 ----> 遍历 [NUM1-NUM2]之间的所有整数格式3: seq 参数NUM1 参数NUM2 参数NUM3 ----> 遍历 [NUM1-NUM3] 之间的整数,但是每次递增 NUM2 值,不指定 NUM2 每次默认递增1, NUM2 ⼜称之为步进值C、练习求1-100之间的和求1-100之间的和10、shell 语法:流程控制循环实现之whileA、格式语法: while [ boolean表达式 ] do done举例:(需求:遍历 1-10之间所有整数)遍历1-10B、练习求1-100之间的和求1-100之间的和综合练习:输⼊⼀个⽬录,判断⽬录是否存在,如果不存在则给出提⽰,如果存在则提⽰输⼊要创建的⽂件名,(前提:要先进⼊⽬录)判断创建的⽂件是否存在,如果不存在,则继续创建,否则提⽰该⽂件已经存在需求:⽬录操作与⽂件操作,分别两个函数实现,两个函数中分别实现业务逻辑(分⽀语句)11、shell 语法其他:重定向A、是什么?可以将命令产⽣的数据保存到磁盘⽂件B、为什么?⼀种序列化(持久化)机制,可以持久的保存数据C、怎么⽤?格式1: 命令 1>> 磁盘⽂件 (将正常结果输出到⽂件) 例如:ls /usr 1>> 格式2: 命令 2>> 磁盘⽂件 (将错误结果输出到磁盘⽂件) 例如:lsxz /usr 2>> 12、shell 语法其他:数组A、是什么?数组也是变量,但是是特殊的变量,⼀般变量只能存储⼀个值,⽽数组可以存储多个值B、为什么?因为数组功能更强⼤C、怎么⽤?数组创建 变量名=(值1 值2 值3 .... )数组查询 查某个元素: ${数组名[索引]}---->索引从 0 开始 查询所有元素: ${数组名[*]} 或者 ${数组名[@]} 查询元素个数: ${#数组名[*]} 或者 ${#数组名[@]}数组修改 变量名[索引]=新值数组删除 unset 数组名(同变量删除)D、应⽤集合循环遍历数组元素⽤数组遍历
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690916595a462857.html
评论列表(0条)