Linux高级03

shell脚本编程

shell解析器:sh csh ksh bash

shell ------ 命令解析器

shell脚本 -----> shell命令的有序集合

把shell命令按一定的逻辑集合到一起,写入一个.sh的文件,去实现一个或多个功能,脚本文件不需要编译,可以直接执行

编译型:C C++ Java

解释型:脚本 python

写一个shell脚本文件的步骤:

  1. 创建一个.sh文件

touch test.sh

  1. 编辑脚本内容
  1. 执行脚本文件

1)chmod 777 test.sh

./test.sh

2)bash test.sh

shell变量

shell中可以建立变量存储数据,但是不支持数据类型,所有赋值给变量的值都解释为一串字符

格式:

变量名=值

注意:=左右两边都不能有空格

取变量的值:$变量名

自定义变量

复制代码
变量名=值`
`变量名='值'`
`变量名="值"`
`'  '内不支持$展开变量的值`
`

位置变量 和命令行参数

$0 - --> 执行脚本文件

1 2 3 ... 9

${n} ------ n 大于或等于10的数

$# ------ 获取所有的外部参数的个数(不包括脚本文件名)

\* 或 @ ------ 获取所有的外部参数(不包括脚本文件名)

预定义变量

$? 获取上一条命令是否是正确的执行结果

0为真 非0为假

获取当前脚本的进程ID ![](https://i-blog.csdnimg.cn/direct/ce9be3c3985540a6a68dd6d7bab6c3ad.png) ### **shell语句** 1)说明性语句 以#开头到该行结束,不被解释执行 2)功能性语句 任意shell命令 3)结构性语句 条件测试语句、分支语句、循环语句、循环控制语句 #### **功能性语句** ##### **read(类似c语言的scanf)** 从终端获取值赋值给变量 格式: read 变量名1 变量名2 .... 按顺序赋值,把剩下的所有内容赋值给最后一个变量 ![](https://i-blog.csdnimg.cn/direct/9b401e5239a14789b9bbd60ca8a5503d.png) read -p "提示语" 变量名 ... ![](https://i-blog.csdnimg.cn/direct/ee06d80152104c27bb2f9fe6190ccd4c.png) ##### **expr** 算术运算命令,主要用来进行简单的整数运算,如:+ - \* / % ![](https://i-blog.csdnimg.cn/direct/fe89679ccec54909acb00f2752967b49.png) 注意: 运算符左右两侧有空格 \*和()需要加转义字符 expr可以直接输出运算结果,如果后期需要使用该结果,可以结合shell变量 ##### **let** 运算中不能有空格 运算结果需要赋值给一个变量 变量在参与运算的过程中,不用加$取值 ![](https://i-blog.csdnimg.cn/direct/1586156f8d334de4a756b906504a66d2.png) #### **结构性语句** ##### **test语句** 可以测试三种对象: 字符串、整数、文件属性 字符串的测试: ``` s1 = s2` `测试两个字符串的内容是否一样` `test "hello" = "hello"` `echo $?` `# 0` `s1 != s2` `测试两个字符串的内容是否不一样` `test "hlo" != "hello"` `echo $?` `# 0` `-z s1` `测试字符串长度是否为0` `test -z ""` `echo $?` `# 0` `-n s1` `测试字符串长度是否不为0 ``` 整数的测试 a -eq b 相等 a -ne b 不相等 a -gt b 大于 a -ge b 大于等于 a -lt b 小于 a -le b 小于等于 ![](https://i-blog.csdnimg.cn/direct/ae67ff7c1af84c989664d255e34f2387.png) 文件属性测试 ``` -d name` `测试name是否是一个目录` `test -d ~/25081` `echo $?` `-f name` `测试name是否是一个普通文件` `test -f ~/25081/918/test.sh` `echo $?` `-e name` `测试name文件是否存在` `test -e ~/25081/918` `echo $?` ` ``` ##### **分支语句** if语句 基本结构 ``` if 表达式` `then` `命令表` `fi ``` ![](https://i-blog.csdnimg.cn/direct/5a021381a24b4a6eba38487c3b03a29a.png) ``` if 表达式` `then` ` 命令表1` `else` `命令表2` `fi` ` ``` ![](https://i-blog.csdnimg.cn/direct/a1bc295630c1410d873cd7f2cb0f4f5a.png) 使用\[ \]把test省略,\[ \]表示一个test指令 ![](https://i-blog.csdnimg.cn/direct/cc5078a1be774d9ea8f431ddc88bb971.png) 分层结构 ``` if` ` 表达式1` `then` `命令表1` `elif` ` 表达式2` `then` `命令表2` `else` `命令表3` `fi ``` ![](https://i-blog.csdnimg.cn/direct/3aa4b59f02594fc9b9fa7c903b1d2c76.png) 嵌套结构 ``` if` ` 表达式1` `then` `if` `表达式2` `then` `命令表` `fi` `fi ``` 90---100 A \[\[ $num -ge 90 \&\& $num -le 100 \]\] 已知学生成绩(100分为满分)与等级的对应关系为: |------------------|----| | 成绩(grade) | 等级 | | 90\<=grade\<=100 | A | | 80\<=grade\<90 | B | | 70\<=grade\<80 | C | | 60\<=grade\<70 | D | | grade\<60 | E | 请你编写一个程序,要求:输入学生成绩,输出学生成绩对应的等级 ![](https://i-blog.csdnimg.cn/direct/4f02c65672e84ce5bd9c1996e2c541ee.png) 判断文件 先判断是否存在 存在---》文件夹 文件 ![](https://i-blog.csdnimg.cn/direct/a27c37c3a5c3463ab8da133430d10505.png) case语句 ``` case 变量 in` `模式1)` `命令表1` `;;` `模式2)` `命令表2` `;;` `*)` `命令表n` `;;` `esac ``` ![](https://i-blog.csdnimg.cn/direct/497dc24f73f64590b5ccd4d35575236b.png) ##### **循环语句** for ...do...done ``` for` ` 变量名 in` ` 单词表` `do` `命令表` `done ``` for循环的几种书写格式: ``` for i in 1 2 a b c` `do` ` echo "$i"` `done ``` ``` for i in {1..10}` `do` ` echo "$i"` `done` ` ``` 变量i从命令行取值,可以省略in 单词表 ``` for i` `do` ` echo "$i"` `done ``` ``` for ((i=0;i<5;i++))` `do` ` echo "$i"` `done` ` ``` 实现1-10的数字和 ![](https://i-blog.csdnimg.cn/direct/e0aca87128754782b08813124bf39c80.png) ![](https://i-blog.csdnimg.cn/direct/1333f29322fb4dd4b0eeb509a24853c7.png) while...do...done ``` #!/bin/bash` `i=1` `while [ $i -lt 5 ]` `do` ` echo $i` ` ((i++))` `done ```

相关推荐
lly2024062 小时前
Ruby CGI方法详解
开发语言
XiYang-DING2 小时前
【Java】从源码深入理解HashMap和TreeMap
java·开发语言
煜bart2 小时前
使用 TypeScript 实现算法处理
开发语言·前端·javascript
♛识尔如昼♛2 小时前
C 基础(7) - 字符输入/输出和输入验证
c语言·开发语言
小肝一下2 小时前
c++从入门到跑路——string类
开发语言·c++·职场和发展·string类
无巧不成书02182 小时前
Unicode编码机制全解析:从核心原理到Java 实战
java·开发语言·java字符编码·unicode 15.1码点
楼田莉子2 小时前
设计模式:构造器模式
开发语言·c++·后端·学习·设计模式
lly2024062 小时前
Swift 析构过程
开发语言
南境十里·墨染春水2 小时前
linux学习进展 进程
linux·运维·学习