Shell编程

Shell编程

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信