【Linux】shell脚本编程

目录

概念:

shell脚本的本质:

shell脚本编程:

shell变量:

变量的定义格式:

变量的分类

自定义变量:

环境变量:

命令变量与命令行参数:

预定义变量:

shell中的语句

功能性语句

read(类似c当中 scanf)

expr

let

test

字符串测试

整数测试

文件属性测试

结构性语句

if...then...fi

基本结构

分层结构

嵌套结构

elif(多路分支结构)

case语句

for循环

for语句的几种书写格式

while循环

循环控制语句

数组

定义数组

获取数组

数组切片

gcc编译步骤


 

概念:

shell脚本的本质:

shell命令的有序集合

shell既是应用程序又是脚本语言,并且是解释型语言,不需要编译,解释一条执行一条。

shell脚本编程:

将shell命令结合一些按照一定逻辑集合到一起,写一个 .sh文件,实现一个或多个功能,这个脚本不用编译直接执行

创建shell脚本文件的步骤:

1. 创建一个脚本文件touch xxx.sh
2. 将脚本文件的权限修改为可执行chmod 777 xxx.sh
3. 编辑脚本内容vi xxx.sh
4. 执行脚本文件./xxx.sh   或   bash xxx.sh

练习:

1)在当前路径下创建file_1到file_5, 5个普通文件

2)删除 file_2和file_3文件(使用通配符)

3)将剩下的file文件用tar压缩成bz2的格式

4)将压缩文件复制到家目录下

5)进入到家目录解压压缩文件

6)删除压缩包

touch file_{1..5}
rm file_[23]
tar -cvjf file.tar.bz2 file_[^23]
cp file.tar.bz2 ~
cd ~
tar -xvf file.tar.bz2 
rm file.tar.bz2

shell变量:

shell中允许建立变量存储数据,但是不支持数据类型

(如:整型、字符、浮点类型),所有赋值给变量的值都解释为一串字符

变量的定义格式:

变量名=值

注:等号两边不能有空格

取shell变量的值:$变量名

变量的分类

自定义变量:

YY=hello      # YY="hello world"echo $YYXX=$YY   --->  将 YY 的值赋值给 XXecho $XXunset 变量名    ---> 取消该变量的值

环境变量:

系统配置好的、内置变量

使用命令查看系统环境变量: printenv或 env

export 变量名=值 临时终端有效

永久生效只需要将这个命令放到用户目录下 .bashrc 文件中,当前用户永久有效。

若放到 /etc/bash.bashrc 这个文件中所有用户永久有效

命令变量与命令行参数:

$0 执行的脚本名

$1-$9、${10}-${n} 命令行空格传的参数 n:第几个命令行参数

$# 命令行参数个数除 $0

$@$* 遍历输出命令行参数内容

预定义变量:

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

0:真 非0:假

$$ 获取当前shell的进程 PID

shell中的语句

1) 说明性语句

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

#!/bin/bash告诉操作系统使用哪种类型的shell执行此脚本文件

2) 功能性语句

任意的shell命令、用户程序或其他的shell程序

3) 结构性语句

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

功能性语句

read(类似c当中 scanf)

从终端获取值赋值给变量

格式:read 变量名1 变量名2...

加提示语句:read-p"提示字符串"变量名1 变量名2 ...

注:把终端读入空格隔开的第一个单词赋值给第一个变量,第二个单词赋值给第二个变量,依次类推赋值,剩余所有单词赋值给最后一个变量。

expr

算术运算命令expr 主要用于进行简单的整数运算,包括(+)、减(-)、乘(*)、整除(/)、求模(%)等操作

注意:

1) 运算符左右两侧必须有空格

2) *和()必须加转义字符,\*、\( \)

3) expr语句可以直接输出运算结果

如:expr \( 12 + 3 \) \* 2

NUM=`expr \( 12 + 3 \) \* 2`:将运算结果赋值给变量

read -p "要输入的值" val1 val2 val3
expr \( $val1 + $val2 \) \* $val3

let

在运算中不能有空格

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

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

test

test 语句可以测试三种对象

字符串 整数 文件属性

字符串测试
s1 = s2        测试两个字符串的内容是否一样test "hello" = "world"echo $?    # 1        相等为真,不相等为假s1 != s2        测试字符串的内容是否有差异test "hello" != "hello"echo $?    # 1        相等为假,不相等为真-z s1           测试s1字符串长度是否为0test -z "" echo $?    # 0        字符串长度为0test -z "hello"echo $?    # 1        字符串长度不为0-n s1            测试s1字符串长度是否不为空  (空的时候为1,反之为0)test -n ""echo $?    # 1        字符串长度为空,则为假test -n "hello"echo $?    # 0        字符串有长度为真
整数测试
a -eq b        测试a和b是否相等的  # equalread A Btest $A -eq $Becho $?    # 如果两个数相等则为真,反之为假a -ne b        测试 a 和 b是否不相等 # no equalread A Btest $A -ne $Becho $?    # 如果两个数不相等则为真,反之为假a -gt b        测试 a 是否大于 b  # greater thanread A Btest $A -gt $Becho $?    # 如果a大于b则为真,反之为假a -ge b        测试 a 是否大于等于 b  # greater equal thanread A Btest $A -ge $Becho $?    # 如果a大于等b则为真,反之为假a -lt b        测试 a 是否小于 b  # less thanread A Btest $A -lt $Becho $?    # 如果a小于b则为真,反之为假a -le b        测试 a 是否小于等于 b  # less eqaul thanread A Btest $A -le $Becho $?    # 如果a小于等于b则为真,反之为假
文件属性测试
-d name        测试name是否为一个目录test -d 路径echo $?    # 如果name是目录则为真,反之为假-f name        测试name是否为一个普通文件test -f 路径echo $?    # 如果name是普通文件则为真,反之为假-e name        测试文件是否存在test -e 路径echo $?    # 如果文件或目录存在则为真,反之为假

结构性语句

if...then...fi

基本结构
if 表达式
then命令表
fi

分层结构
if 表达式
then命令表1
else命令表2
fi

嵌套结构
if 表达式1
thenif 表达式2then命令表 2else命令表3fi
else命令表
fi

elif(多路分支结构)

if 表达式1
then命令表1
elif 表达式2
then命令表2
elif 表达式3
then命令表3
...
else表达式 n
fi注意:如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi是条件语句的语句括号, 必须成对使用;命令表中的命令可以是一条, 也可以是若干条。

补充操作符:

! 非运算 例如 [ ! false ] 返回 true

&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true

case语句

格式:

case 变量 in
模式1)命令表1;;
模式2)命令表2;;
*)命令表n;;
esac工作方式:取值后面必须为关键字 in ,每一个模式必须以右括号结束。取值可以为变量或者常量,取值检测匹配的每一个模式一旦模式匹配,其间所有命令开始执行直至 ;;执行完匹配模式相应的命令不会再继续匹配其他的模式如果无一匹配模式,使用 * 号捕获该值

| 或者 ; 转换模式

学生成绩管理系统,用shell中的case实现

90-100:A

80-89:B

70-79:C

60-69:D

<60:不及格

for循环
格式:
for 变量名 in 单词表
do命令表
done执行顺序:
变量依次取单词表中的各个单词,  每取一次单词, 就执行一次循环体中的命令.  循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条for I in 1 2 3 4 5 6 7 8 9 10
doecho "$I"
done
for语句的几种书写格式
变量I从单词表中取值
1) for I in 1 2 3 4 5 6 7 8 9 10 do ... done变量I从 1-10个数中取值
2) for I in {1..10} do ... done变量I从命令行取值,省略in、单词表
3) for I do ... done./脚本名 1 2 3 4 5书写格式类似C语言
4) for (( i = 0; i < 10; i++ )) do ... done
for (( i = 0; i < 10; i++ ))
doecho "$i"
done
while循环
格式:
while 命令或表达式
do命令表
done执行顺序:
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。I=1
while [ $I -lt 10 ]
doecho $I(( I++ ))
doneecho $(( I++ ))
循环控制语句

breakn:结束n层循环

continuen:跳过n层本次循环,继续下一个循环

for (( i = 0; i < 10; i++ ))
dofor (( j = 0; j < 10; j++ ))doif [ $j -eq 3 ]then# continue# continue 2# breakbreak 2fiecho "$i:$j"done
done

数组

定义数组

在shell当中,用小括号 ( ) 来表示数组,数组元素之间用空格来隔开

1. 数组名=(value1 value2 value3 ...)

2. 数组名=(

value1

value2

...

)

3. 通过键值对的形式赋值

数组名=([0]=value1 [1]=value2)

4. 通过分别定义数组变量的方式来定义

数组名[0]="value1"

数组名[1]="value2"

5. 列表名="value0value1 value2"

数组名=($列表名)

注意:

1. 数组中的元素,必须以空格来隔开

2. 定义数组以其索引,可以不按顺序来定义的 如:数组名=([0]=value0 [1]=value2 [8]=array)

3. 字符串是数组中最重要的数据类型,可以通过 ($str) 转成数组

获取数组

1. 获取单个数组元素

${数组名[下标]}

2. 获取数组全部内容

${数组名[@]}或 ${数组名[*]}

3. 获取数组元素的个数

${#数组名[@]} 或 ${#数组名[*]}

数组切片

取数组中的某一段的元素的值

格式:

${数组名[@或*]:起始位置:长度}

gcc编译步骤

预处理:处理以#开头的内容,展开头文件、替换宏定义、删除注释,但是不会进行语法检查。
gcc -E xxx.c -o xxx.i编译:进行语法检查,将.i文件转化成.s汇编文件
gcc -S xxx.i -o xxx.s汇编:将汇编文件转化成二进制文件(不可执行)
gcc -c xxx.s -o xxx.o链接:链接库文件,将不可执行的二进制文件转化成可执行的二进制
gcc xxx.o -o xxx写 Makefile 时一般这样写
gcc xxx.o -o xxx
gcc -c xxx.c -o xxx.o

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/504145.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

接口测试-postman(使用postman测试接口笔记)

一、设置全局变量 1. 点击右上角设置按钮-》打开管理环境窗口-》选择”全局“-》设置变量名称&#xff0c;初始值和当前值设置一样的&#xff0c;放host放拼接的url&#xff0c;key放鉴权那一串字符&#xff0c;然后保存-》去使用全局变量&#xff0c;用{{变量名称}}形式 二、…

Django学习笔记之数据库(一)

文章目录 安装一、数据库配置二、基本操作步骤1.增加2.查看3.排序4.更新5.删除数据 三、一对多&#xff0c;多对多&#xff0c;一对一1.一对多1.一对一1.多对多 四、查询操作五、聚合操作六、F和Q操作 安装 首先就是安装Mysql和Navicat。 一、数据库配置 其实整个就是连接前端…

【工具变量】统计行业锦标赛激励数据集(2008-2023年)

一、数据简介 坚持创新驱动发展&#xff0c;要强化企业创新主体地位&#xff0c;发挥企业家在技术创新中的重要作用。作为企业组织内部最具有影响力的角色&#xff0c;高级管理人员拥有企业经营管理的自由裁量权&#xff0c;对企业战略决策及由此产生的经营绩效具有举足轻重的…

DuckDB:PRAGMA语句动态配置数据库行为

PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态&#xff0c;并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。 DuckDB PRAGMA介绍 在 DuckDB 中&#xff0c;PRAGMA 是一种编译指示&#xff08;compiler directi…

【QT-QTableView实现鼠标悬浮(hover)行高亮显示+并设置表格样式】

1、自定义委托类 HoverDelegate hoverdelegate.h #ifndef HOVERDELEGATE_H #define HOVERDELEGATE_H#include <QObject> #include <QStyledItemDelegate>class hoverdelegate : public QStyledItemDelegate {Q_OBJECT // 添加 Q_OBJECT 宏public:explicit hoverde…

Improving Language Understanding by Generative Pre-Training GPT-1详细讲解

Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV&#xff1a;ImageNet pre-trained model NLP&#xff1a;pre-trained model? 在计算机视觉中任务包含分类、检测、分割&#xff0c;任务类别数少&#xff0c;对应…

大数据技术 指令笔记1

3.cd命令 cd命令用来切换工作目录至DirName。其中DirName表示法可为绝对路径或相对路径 例如&#xff1a; cd/ 切换到根目录 cd 切换到家目录 cd /etc/sysconfig/ 切换到/etc/sysconfig目录 cd .. 返回到父目录 4.Is命令 Is命令用来列出文件或…

创建Java项目,并添加MyBatis包和驱动包

一 : Mybatis和jsp使用上,只有Dao层有区别 Mybatis 使用方法: 测试类的7步骤 1.读取核心配置文件 2.构建sql会话工厂 3.开启sql会话 4.获取mapper接口 5.调用相对应的增删改查方法 6.打印 7.关闭回话 /*** 用户列表* throws IOException*/Testpublic void roleList() throws IO…

【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

结构化日志和集中日志服务

目录 结构化日志 Serilog使用 集中化日志 集中日志服务 Exceptionless 控制台项目 总结 结构化日志 结构化日志比普通文本更利于日志的分析&#xff0c;比如统计“邮件发送失败”错误发生了多少次。 NLog也可以配置结构化日志&#xff0c;不过配置麻烦&#xff0c;推荐…

OpenAI CEO 奥特曼发长文《反思》

OpenAI CEO 奥特曼发长文《反思》 --- 引言&#xff1a;从 ChatGPT 到 AGI 的探索 ChatGPT 诞生仅一个多月&#xff0c;如今我们已经过渡到可以进行复杂推理的下一代模型。新年让人们陷入反思&#xff0c;我想分享一些个人想法&#xff0c;谈谈它迄今为止的发展&#xff0c;…

Agentic RAG 解释

RAG&#xff08;检索增强生成&#xff09;通过提供来自外部知识源的相关背景来帮助提高 LLM 答案的准确性和可靠性。 Agentic RAG 是高级 RAG 版本&#xff0c;它使用 AI 代理来更加自主地行动。 Agentic RAG 执行以下操作 查询理解、分解和重写检索策略选择知识库管理结果综…

pg数据库运维经验2024

这篇文章主要是讲pg运维常见问题&#xff0c;两三年见一次的疑难杂症就不说了。 主要是技术性运维总结&#xff0c;主打通俗易懂和快速上手&#xff0c;尽量避免源码层面等深入分析。 SQL性能与执行计划 执行计划突变 pg官方不支持hint功能&#xff0c;并且计划永远不支持&…

每日一题-两个链表的第一个公共结点

文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表&#xff0c;找到它们的第一个公共节点。如果没有公共节点&#xff0c…

生成模型:变分自编码器-VAE

1.基本概念 1.1 概率 这里有&#xff1a; x为真实图像&#xff0c;开源为数据集, 编码器将其编码为分布参数 x ^ \hat{x} x^为生成图像, 通过解码器获得 p ( x ) ^ \hat{p(x)} p(x)^​: 观测数据的分布, 即数据集所构成的经验分布 p r e a l ( x ) p_{real}(x) preal​(x): …

攻防世界 wtf.sh-150

点进去&#xff0c;发现是一个类似于论坛的网站&#xff0c;并且对报错等做了处理 用御剑扫描一下 ​ 发现是php形式的文件&#xff0c;但点进去访问不了。看看wp&#xff0c;发现此题存在路径穿越漏洞&#xff0c;就是&#xff08;如果应用程序使用用户可控制的数据&#xff0…

Google Play开发者账号的高风险行为解析

在安卓应用开发行业里&#xff0c;Google Play 开发者账号是开发者们通向全球用户的重要桥梁。凭借它&#xff0c;开发者们能够将精心打造的应用推向市场&#xff0c;然而&#xff0c;开发者账号的使用也包含了诸多风险&#xff0c;一些不经意的操作可能会给开发者账号带来封禁…

网络安全-web应用程序发展历程(基础篇)

1.网站程序发展 web1.0 网站是别人的&#xff0c;只能是随便看看 web2.0网站是朋友的&#xff0c;可以进行交流了 web3.0网站是自己的&#xff0c;可以实现买卖交流。 静态内容阶段&#xff1a;web由大量的静态文档构成&#xff0c;web被看作成超文本共享文件服务器。别人只…

继承(6)

大家好&#xff0c;今天我们来继续学习继承的内容&#xff0c;了解一下this和super两者的一些特性和区别。话不多说&#xff0c;来看。 1.7 super 和 this super和 this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有…