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)

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

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

相关文章

Linux C 使用ZBar库解析二维码和条形码

1. 编译zbar库 下载 zbar 库源码&#xff0c;这里需要注意下&#xff0c;如果识别的二维码中有中文的话&#xff0c;会出现乱码&#xff0c;一般二维码里中文为UTF-8编码&#xff0c;zbar会默认给你把UTF-8转换为ISO8859-1。有两种解决办法&#xff0c;一是自己再转换一下编码…

【北京迅为】iTOP-4412全能版使用手册-第七十九章 Qt网络编程

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

用python实战excel和word自动化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现excel和word自动化--批量处理 前言--需求快要期末了需要&#xff0c;提交一个年级的学生成绩数据&#xff0c;也就是几百份。当前我们收集了一份excel表格&#xf…

【R安装】R语言的详细安装及环境配置(2024年11月)

目录 R及Rstudio下载R下载Rstudio下载 R及Rstudio安装R安装Rtools 安装Rstudio安装 运行 RStudio通过RStudio配置使用特定的R版本 参考 R及Rstudio下载 R下载 R官网-The R Project for Statistical Computing 点击【download R】&#xff0c;进入下载界面&#xff1a; 选择…

Docker官网安装

1.官网 官方文档 https://www.docker.com/ Docker Hub官网 镜像 https://hub.docker.com/ 2.Docker 的三要素 1、镜像 2、容器 3、仓库 小总结 3.Docker 平台架构图 &#xff08;架构版本&#xff09; 4.安装Docker CentOS | Docker Docs 1.确定你是CentOS7及以上版本 …

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

GARCH指导的神经网络在金融市场波动性预测中的应用

“GARCH-Informed Neural Networks for Volatility Prediction in Financial Markets” 论文地址&#xff1a;https://arxiv.org/pdf/2410.00288v1 摘要 波动性作为衡量风险的关键指标&#xff0c;广泛应用于金融投资的定价中。GARCH模型及其变体是用于股票波动性预测的传统工…

STM32-笔记43-低功耗

一、什么是低功耗&#xff1f; 低功耗‌是指通过优化设计和采用特定的技术手段&#xff0c;降低电子设备在运行过程中消耗的能量&#xff0c;从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计和系统设计两个方面进行&#xff0c;旨在减少所有器件的功率损耗&am…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

辅助云运维

为客户提供运维支持&#xff0c;保障业务连续性。 文章目录 一、服务范围二、服务内容三、服务流程四、 服务交付件五、责任分工六、 完成标志 一、服务范围 覆盖范围 云产品使用咨询、问题处理、配置指导等&#xff1b; 云产品相关操作的技术指导&#xff1b; 云相关资源日常…

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下&#xff1a; TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因&#xff0c;排查还得去看源码&#xff0c;所以我们来解决&a…

一分钟学习数据安全——数据安全的核心概念CIA以及安当解决方案

数据安全三要素是指保密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integrity&#xff09;和可用性&#xff08;Availability&#xff09;&#xff0c;它们是信息安全领域的核心概念&#xff0c;旨在确保信息的安全和可信度。这边文章用一分钟的时间&#…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

事件监听,事件类型

点击按钮实现 盒子关闭 随机点名案例 先给开始按钮添加点击事件 获取显示名字的 div 和 开始按钮的 div给开始按钮添加点击事件&#xff0c;设置定时器&#xff0c;每隔35ms内获取一个数组长度内的随机数&#xff0c;将显示名字的 div内的内容替换为该随机数作为下标的数组的内…

基于PyQt - 6的医疗多模态大模型医疗研究系统中的创新构建与应用(上 .文章部分)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗行业正经历着深刻的变革,对智能化、高效化的需求日益迫切。传统的医疗模式在面对海量的医疗数据、复杂的诊断流程以及个性化的治疗需求时,逐渐显露出局限性。随着人工智能技术的飞速发展,多模态大模型作为一种前沿技术…

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日&#xff0c;微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4&#xff0c;这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置&#xff0c;在复杂推理任务中表现出色&#xff0c;特别是在数学领域&#xff0c;更是展现出了卓越的能…

深度解析Linux中关于操作系统的知识点

操作系统概述与核心概念 任何计算机系统都包含一个基本的程序集合&#xff0c;成为操作系统OS 操作系统是一款进行软硬件管理的软件 操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;驱动管理&#xff09; 其他程序&#xff08;例如数据…

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 &#xff0c;是三格电子推出的工业级网关&#xff08;以下简 称网关&#xff09;&#xff0c;主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集&#xff0c; IEC103 支持遥测和遥 信&#xff0c;可接…

如何监控和防范小红书笔记详情API的安全风险?

流量监控与异常检测 请求频率监测&#xff1a; 建立一个系统来记录 API 的请求频率。可以通过在服务器端设置计数器或者使用专业的监控工具来实现。例如&#xff0c;对于每个 API 调用者&#xff08;可以通过 API 密钥或者用户标识来区分&#xff09;&#xff0c;记录它们在单…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…