当前位置: 首页 > news >正文

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句

6.3、结构性语句

6.3.1、if

        if…then…fi

1、结构

1)基本结构

        if 表达式

        then

                命令表

        fi

        if  [ 表达式 ]        // 【】两侧有空格

        then

                命令表

        fi

 2)分层结构

        if 表达式

        then

                命令表1

        else

                命令表2

        fi

 3)嵌套结构

        if 表达式

        then

                if

                then

                        命令表1

                else

                        命令表2

                fi

        else

                if

                then

                        命令表3

                else

                        命令表4

                fi

        fi

 4)elif

        if 表达式1

        then

                命令表1

        elif 表达式

        then 

                命令表2

        ……

        else

                命令表n

        fi

6.3.2、case语句

结构

        case 变量 in        // 取值后面必须为关键字 in,取值可以为变量或者常量

        模式1)        // 每个模式必须以右括号结束

                命令表1        // 一旦模式匹配,其间所有命令开始执行,直到 ;; 结束

                ;;        // 执行完匹配模式相应命令后,不hi再继续匹配其他格式

        模式2)        // 取值检测匹配的每一个模式

                命令表2

                ;;

        …

        *)        // 如果没有模式匹配成功,使用 * 捕获该变量

                命令表 n

                ;;

        esac

 6.3.3、for循环

结构:

        for 变量名 in 单词表        // 变量依次取单词表中的各单词

        do        // 每取一次单词,就执行循环体中的命令

                命令表        // 可以是一条,也可以是换行符分开的多条

        done        // 循环次数由单词表中的单词数确定

书写格式:

1)变量 I 从单词表中取值

2)变量I 从命令行取值,省略 in 和单词表

 3)变量i在单词表内通过通配符取值

4)书写格式类似C语言        // 两个空格里的表达式两端用空格与括号隔开

5)输出当前目录下的所有文件名字

 6.3.4、while循环

结构

        while 命令表达式        // 首先测试其后的命令或表达式的值

        do        // 为真进入循环

                命令表

        done        // 为假退出循环

6.3.5、循环控制语句

break:

        break        // 结束本层循环

        break n         // 结束 n 层循环,内层往外数 n 层,都结束

continue:

        continue         // 跳过本层本次循环

        continue n         // 跳过 n 层本次循环,内层往外数 n 层,这 n 层本次循环都跳过

7、分文件

        整个工程包含多个.c和多个.h文件

7.1、分文件包括

1、main.c

        main()        // 这些文件统一由 main 函数调用

2、xxx.c

        多个.c        // 不同功能的函数接口

3、.h 头文件包含:

        1、包含其他的头文件

        2、函数声明

        3、构造数据类型,可以定义类型之后定义变量,但是不能同时定义

        4、宏定义

        5、重定义的名字

        6、全局变量

7.2、分文件使用

include 引用时 “ ” 和 < > 的区别

        <stdio.h>        // 系统定义的头文件:去系统目录下查找头文件

        “add.h”        // 自定义头文件:先从当下目录下查找,如果没有,再去系统目录下查找头文件

7.3、条件编译

        编译器根据条件的真假,决定是否编译相关代码

1、根据宏是否定义

格式

#ifdef 宏名

        代码块1        // 宏定义,代码块1被编译

#else

        代码块2        // 宏没有被定义,代码块2被编译

#endif

#include <stdio.h>
#define EDFint main(int argc, char const *argv[])
{#ifdef EDFprintf("yes\n");#elseprintf("NO\n");#endifreturn 0;
}
2、根据宏的值是否为真

格式:

#if 宏名

        代码块1        // 宏的值为真,非0,代码块1被编译

#else

        代码块2        // 宏的值为假,0,代码块2被编译

#endif

#include <stdio.h>
#define EDF 1int main(int argc, char const *argv[])
{#if EDFprintf("yes\n");#elseprintf("NO\n");#endifreturn 0;
}
 3、根据宏是否定义

        防止头文件重复包含

结构:

#ifndef 宏名        // 第一次展开,询问是否有宏,没有编译下列代码块,

                           // 第二次展开,询问是否有宏,第一次展开的时候定义了宏,

                                所以这一次有有宏,下面的代码块不进行编译

#define 宏名        // 定义一个同名宏,然后继续执行后面的代码块,

……

#endif

8、make工具

8.0、gcc 编译步骤

预处理:

        处理以#开头的内容,展开头文件,替换宏定义,删除注释,不进行语法检查

        gcc -E xxx.c -o xxx.i

编译:

        检查语法错误,有错报错,没错生成汇编文件

        gcc -S xxx.i -o xxx.s

汇编:

        生成不可执行的二进制文件

        gcc -c xxx.s -o xxx.o

链接:

        链接库文件,生成可执行的二进制文件

        gcc xxx.o -o xxx

8.1、make工具的内容

        1、make工具又叫工程管理器,作用是在文件过多时管理文件

                // 能根据文件时间戳,发现更新过的文件而减少编译工作量的同时,它通过读入文件的内容,来执行大量的编译工作

        2、Makefile 是 make 读入的唯一配置文件

                // Makefile 工程文本文件

 8.2、Makefile 书写格式

8.2.1、基础书写方式

目标(可执行文件): 依赖文件(二进制文件)

<tab>命令        // gcc xxx.o -o xxx

目标(二进制文件): 依赖文件(.c文件)

<tab>命令        // gcc -c xxx.c -o xxx.o

.PHONY: clean        // 目的不是创建clean文件,而是执行下列命令

目标(clean):        // 删除 .o 文件和可执行文件

<tab>伪命令        // rm -rf *.o main

示例:写一个makefile文件

main: main.o fun.o

gcc main.o fun.o -o main

main.o: main.c

gcc -c main.c -o main.o

fun.o: fun.c

gcc -c fun.c -o fun.o

.PHONY: clean

clean:

rm -rf *.o main

执行:
make        // 执行前面的编译过程

make clean        // 执行删除命令

8.2.2引入自定义变量和预定义变量

        通过定义变量来重新书写makefile文件

自定义变量

        一般用大写表示变量名,取变量值用$(变量名)

        =        // 递归赋值(以最后一次赋值为准),找到最后一次赋值之后,前面所有该变量全都变成最后一次赋值的值

        :=        // 立即赋值(当前是什么就立即是什么值),以当前值为准,直接确定

        +=        // 追加赋值(追加新的值),以字符串的形式追加,追加前自动增加分隔符

        ?=        // 条件赋值(判断之前是否定义,如果定义,不重新赋值,否则赋值),前面有值了,就保持,前面没有值就赋值

 预定义变量

        系统预先定义好的一些变量,可能有默认值,可能没有

        RM        // 文件删除程序的名称,默认值为rm -f

        CC        // C编译器的名称,默认值是cc

        CPP        // C预编译器的名称,默认值是$(CC) -E

        CFLAGS        // C编译器的选项,无默认值

                // -g 调试        -Wall 加警告

        OBJS        // 生成的二进制文件或者目标文件,自己定义的

makefile文件书写方式2

EXE=main        # 保存可执行文件

OBJS=main.o fun.o

CC=gcc

CFLAGS=-c -g -Wall        # -g 调试        -Wall:警告

$(EXE): $(OBJS)

        $(CC) $(CFLAGS) -o $(EXE)

main.o: main.c

        $(CC) $(CFLAGS) main.c -o main.o

fun.o: fun.c

        $(CC) $(CFLAGS) fun.c -o fun.o

.PHONY: clean

clean:

        $(RM) $(OBJS) $(EXE)

8.2.3、引入自动变量和通配符修改makefile

自动变量

        $<        // 第一个依赖文件

        $@        // 目标文件的完整名称

        $^        // 所有不重复的依赖文件,以空格分开

通配符

        %        // 字符串的匹配模式,在Makefile中作用是,获取一个.o 文件,然后匹配一个同名.c

                // %.o: %.c

makefile文件书写方式3

EXE=main # 保存可执行文件

OBJS=main.o fun.o

CC=gcc

CFLAGS=-c -g -Wall # -g调试 -Wall:警告

$(EXE): $(OBJS)

$(CC) $^ -o $@

%.o: %.c

$(CC) $(CFLAGS) $< -o $@

.PHONY: clean

clean:

$(RM) $(OBJS) $(EXE)

 8.2.4、引入函数

1、要求:

        make 中提供了内置函数        // 内置函数是帮助程序员查找文件信息的,所以要求在查找目录下,只有程序需要的 .c 文件,没有其他程序的 .c 文件

2、wildcard

功能:

        根据给的条件,获取指定的文件名(找文件)

命令:

        $(wildcard 指定字符串的格式)

        $(wildcard *.c)        // 找到当前路径下,所有的 .c 文件的文件名

3、patsubst

功能:

        模式匹配替换字符串

命令:

        $(patsubst 原格式,目标格式,要替换的字符串)

        $(patsubst %.c,%.o,main.c fun.c)        // 获取到main.c fun.c 字符串,根据模式匹配,得到main.o fun.o 字符串每个参数之间以‘,’作为分隔,要替换的字符串之间以空格作为分隔

makefile文件书写方式4
EXE=main # 保存可执行文件

FILES=$(wildcard *.c)

OBJS=$(patsubst %.c,%.o,$(FILES))

CC=gcc

CFLAGS=-c -g -Wall # -g调试 -Wall:警告

$(EXE): $(OBJS)

$(CC) $^ -o $@

%.o: %.c

$(CC) $(CFLAGS) $< -o $@

.PHONY: clean

clean:

$(RM) $(OBJS) $(EXE)

相关文章:

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1&#xff09;基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2&#xff09;分层结构 if 表达式 then 命令表1 else 命令表2 fi 3&#xff09;嵌套结构 if …...

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...

Redis 如何解决大 key 问题

前言 嗨&#x1f44b;&#xff0c;大家好&#xff0c;我是雪荷。做为一个后端开发&#xff0c;Redis 是我们经常接触到的一个非关系行数据库。其对我们系统开发和优化有着举足轻重的作用&#xff0c;但是随着业务和用户迅速增长&#xff0c;也会滋生许多的问题&#xff0c;而大…...

驱动开发系列33 - Linux Graphics mesa Intel驱动介绍

一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…...

【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】

【华为OD-E卷 - 整数编码 100分&#xff08;python、java、c、js、c&#xff09;】 题目 实现一种整数编码方法&#xff0c;使得待编码的数字越小&#xff0c;编码后所占用的字节数越小。 编码规则如下: 编码时7位一组&#xff0c;每个字节的低7位用于存储待编码数字的补码 字…...

vue3 uniapp封装一个瀑布流组件

新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...

Android Room 持久化库的介绍及使用方法

Android Room 是 Android Jetpack 组件之一&#xff0c;是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层&#xff0c;允许开发者在 SQLite 数据库上执行常见的 CRUD 操作&#xff0c;同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...

Go语言中http.Transport的Keep-Alive配置与性能优化方法

在Go语言中&#xff0c;http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具&#xff0c;它提供了许多可配置的参数以优化性能。其中&#xff0c;Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释&#xff1a; 一、…...

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo

1.策略模式 好处&#xff1a;动态切换算法或行为场景&#xff1a;实现同一功能用到不同的算法时和简单工厂对比&#xff1a;简单工厂是通过参数创建对象&#xff0c;调用同一个方法&#xff08;实现细节不同&#xff09;&#xff1b;策略模式是上下文切换对象&#xff0c;调用…...

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...

【matlab】matlab知识点及HTTP、TCP通信

1、矩阵运算 点乘&#xff1a;对于两个同维度的向量&#xff0c;点乘结果是这两个向量对应分量的乘积之和。 点除&#xff1a;是指对两个数组的对应元素进行除法运算。 点幂&#xff1a;表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…...

kalilinux - msf和永恒之蓝漏洞

Kali最强渗透工具 - metasploit metasploit是什么&#xff1f; msf是一款开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行的sheelcode&#xff0c;并持续保持更新。 具体操作 1、先切换到root用户&#xff0c;使用msfdb init命令初始化metaspl…...

网络安全测评质量管理与标准解读

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 注意说明 刚开始写过一些比较专业的分享&#xff0c;较多粉丝反应看不懂&#xff0c;本次通过大众的通俗易懂的词汇先了解概念然后再分享规范和详细的技术原理 一、网络安全测评质量管理 网络安全测…...

Cesium根据地图的缩放zoom实现不同级别下geojson行政边界的对应展示

实现效果&#xff1a; 随着地图的缩放&#xff0c;展示对应缩放级别下的行政边界。 准备数据&#xff1a; 1.国家行政边界数据 &#xff08;country.json&#xff09; 2.省级行政边界数据 &#xff08;province.json&#xff09; 3.市级行政边界数据&#xff08;city.json&…...

Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类&#xff08;人&#xff09; 2.2.2文件类型和访问权限&#xff08;事物属性&#xff09; 2.2.3文件权限值的表示方法 字符…...

深入剖析 Wireshark:网络协议分析的得力工具

在网络技术的广阔领域中&#xff0c;网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具&#xff0c;在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…...

Redisson中红锁(RedLock)的实现

一、什么是红锁 当在单点redis中实现redis锁时&#xff0c;一旦redis服务器宕机&#xff0c;则无法进行锁操作。因此会考虑将redis配置为主从结 构&#xff0c;但在主从结构中&#xff0c;数据复制是异步实现的。假设在主从结构中&#xff0c;master会异步将数据复制到slave中…...

小结:路由器和交换机的指令对比

路由器和交换机的指令有一定的相似性&#xff0c;但也有明显的区别。以下是两者指令的对比和主要差异&#xff1a; 相似之处 基本操作 两者都支持类似的基本管理命令&#xff0c;比如&#xff1a; 进入系统视图&#xff1a;system-view查看当前配置&#xff1a;display current…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...