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

shell语句

1)说明性语句

以#开头到该行结束,不被解释执行

2)功能性语句

任意shell命令

3)结构性语句

条件测试语句、分支语句、循环语句、循环控制语句

功能性语句

read(类似c语言的scanf)

从终端获取值赋值给变量

格式:

read 变量名1 变量名2 ....

按顺序赋值,把剩下的所有内容赋值给最后一个变量

read -p "提示语" 变量名 ...

expr

算术运算命令,主要用来进行简单的整数运算,如:+ - * / %

注意:

运算符左右两侧有空格

*和()需要加转义字符

expr可以直接输出运算结果,如果后期需要使用该结果,可以结合shell变量

let

运算中不能有空格

运算结果需要赋值给一个变量

变量在参与运算的过程中,不用加$取值

结构性语句

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 小于等于

文件属性测试

复制代码
-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
复制代码
if 表达式`
`then`
`    命令表1`
`else`
    `命令表2` 
`fi`
`

使用 把test省略, 表示一个test指令

分层结构

复制代码
if` ` 表达式1`
`then`
    `命令表1`
`elif` ` 表达式2`
`then`
    `命令表2`
`else`
    `命令表3`
`fi

嵌套结构

复制代码
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 |

请你编写一个程序,要求:输入学生成绩,输出学生成绩对应的等级

判断文件

先判断是否存在

存在---》文件夹 文件

case语句

复制代码
case  变量  in`
`模式1)`
    `命令表1`
    `;;`
`模式2)`
    `命令表2`
    `;;`
`*)`
    `命令表n`
    `;;`
`esac
循环语句

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的数字和

while...do...done

复制代码
#!/bin/bash`
`i=1`
`while [ $i -lt 5 ]`
`do`
`    echo $i`
`    ((i++))`
`done
相关推荐
风曦Kisaki5 分钟前
Kubernetes(K8s)笔记Day04:控制器(ReplicaSet 与Deployment),滚动更新及回滚,滚动更新策略,Pod 的 DNS 策略
linux·运维·笔记·docker·容器·kubernetes
code_whiter5 分钟前
初阶linux2环境基础开发工具完整教程
linux
星恒随风7 分钟前
C++ STL 详解:set 与 multiset 的使用、区间查询和算法应用
开发语言·c++·笔记·学习·算法
数聚天成DeepSData14 分钟前
外贸海关进出口数据去哪免费下载?从统计到明细的查找指南
linux·服务器·开发语言·前端·网络·人工智能·自然语言处理
再卷也是菜16 分钟前
C++11支持并发库
开发语言·c++
Huangjin007_17 分钟前
【Linux 系统篇(十)】基础开发工具(五) —— 第一个系统程序 - 进度条
linux·运维·服务器
Lhan.zzZ19 分钟前
QML 开发中的“陷阱”:动态模型更新时,ComboBox 索引为何总是失效?
开发语言·qt
小园子的小菜34 分钟前
Java 并发四大工具类深度解析:CountDownLatch、CyclicBarrier、Semaphore、Exchanger 原理、源码与面试考点
java·开发语言·面试
河西石头1 小时前
再谈C#的抽象类和接口:从“适配器”到“毛坯房”的设计哲学
开发语言·c#·接口·依赖注入·抽象类·依赖倒挂
时空无限1 小时前
linux mellanox 网卡队列 irq rps 相关
linux·运维