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.rhkb.cn/news/2905.html

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

相关文章

tomcat文件目录讲解

目录的用处 bin&#xff1a;tomcat的可执行命令&#xff0c;比如&#xff1a;tomcat的启动停止命令&#xff0c;也包含其他命令以及.bat&#xff08;Windows执行的命令&#xff09;和.sh&#xff08;Linux操作系统执行的命令&#xff09;文件config:关于tomcat的配置&#xff0…

【Rust自学】12.4. 重构 Pt.2:错误处理

12.4.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读取…

梁山派入门指南4——定时器使用详解,包括定时器中断、PWM产生、输入捕获测量频率

梁山派入门指南4——定时器使用详解&#xff0c;包括定时器中断、PWM产生、输入捕获测量频率 1. 定时器概览2.基本定时器2.1 基本定时器介绍2.2 梁山派上的基本定时器开发2.2.1. 了解梁山派上的基本定时器资源&#xff08;实际上我们以及在上面了解过了&#xff09;2.2.2. 配置…

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…

JVM类加载器(附面试题)

什么是类加载器 类加载器&#xff08;ClassLoader&#xff09; 是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;用于在运行时将字节码文件加载到内存中&#xff0c;并将其转换为 JVM 可以执行的二进制数据结构。 字节码文件通常是以.class为扩展名的文件…

FFmpeg硬件解码

使用FFmpeg进行硬件解码时&#xff0c;通常需要结合FFmpeg的API和硬件加速API&#xff08;如CUDA、VAAPI、DXVA2等&#xff09;。以下是一个简单的C代码示例&#xff0c;展示如何使用FFmpeg进行硬件解码。这个示例使用了CUDA作为硬件加速的后端。 1. 安装FFmpeg和CUDA 确保你…

Linux 进程前篇(冯诺依曼体系结构和操作系统)

目录 一.冯诺依曼体系结构 1.概念 2.硬件层面的数据流 3.总结加补充 二.操作系统 (Operating System) 1.概念 2.设计OS的目的 3.定位 4.操作系统的管理 5.计算机体系的层状结构 在我们认识进程之前&#xff0c;我们先了解什么是冯诺依曼体系结构 一.冯诺依曼体系结构…

Redis 3.2.1在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个文件可以跟我要&#xff0c;也可以从官网下载&#xff1a;https://github.com/MicrosoftArchive/redis/releases 这个是微软以前维护的Windows版Redis安装包&#xff0c;如果想要比较新的版本可以从别人维护的项目里下&#xff08;https://…

Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例

文章目录 前言示例一、球体的基础配置二、三个球体的设置差异三、示例意图LatencySimulation前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开…

JAVA实现五子棋小游戏(附源码)

文章目录 一、设计来源捡金币闯关小游戏讲解1.1 主界面1.2 黑棋胜利界面1.3 白棋胜利界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/145161039 JA…

深度学习图像算法中的网络架构:Backbone、Neck 和 Head 详解

深度学习已经成为图像识别领域的核心技术&#xff0c;特别是在目标检测、图像分割等任务中&#xff0c;深度神经网络的应用取得了显著进展。在这些任务的网络架构中&#xff0c;通常可以分为三个主要部分&#xff1a;Backbone、Neck 和 Head。这些部分在整个网络中扮演着至关重…

Jmeter如何进行多服务器远程测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…

摄像头模块在狩猎相机中的应用

摄像头模块是狩猎相机的核心组件&#xff0c;在狩猎相机中发挥着关键作用&#xff0c;以下是其主要应用&#xff1a; 图像与视频拍摄 高清成像&#xff1a;高像素的摄像头模块可确保狩猎相机拍摄出清晰的图像和视频&#xff0c;能够捕捉到动物的毛发纹理、行为细节及周围环境的…

[操作系统] 深入理解操作系统的概念及定位

概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。 其核心功能如图片所示&#xff0c;包括&#xff1a; 内核 (Kernel)&#xff1a; 内核是操作系统的核心部分&#xff0c;被认为是狭义上的操作系统&#xff0c;直接与硬件打交道。负责进程管理、内…

Jmeter 简单使用、生成测试报告(一)

一、下载Jmter 去官网下载&#xff0c;我下载的是apache-jmeter-5.6.3.zip&#xff0c;解压后就能用。 二、安装java环境 JMeter是基于Java开发的&#xff0c;运行JMeter需要Java环境。 1.下载JDK、安装Jdk 2.配置java环境变量 3.验证安装是否成功&#xff08;java -versio…

postgresql分区表相关问题处理

1.使用pg_cron按日创建分区表&#xff0c;会出现所在数据库对应用户权限不足的问题。 原因是pg_cron运行在postgres数据库中&#xff0c;是用superuser进行执行的&#xff0c;对应的分区表的owner为postgres&#xff0c;所以需要单独授权对表的所有操作权限。不知道直接改变ow…

Agent一键安装,快速上手Zabbix监控!

目录 一、Linux操作系统部署Agent环境配置1、防火墙配置2、永久关闭selinux yum方式安装1、配置zabbix仓库2、安装agent3、配置 Zabbix-Agent 指向 Zabbix-Server4、启动agent服务 二进制包安装1、下载二进制包2、创建用户和目录及更改属主&#xff08;组&#xff09;3、解压二…

内存与缓存:保姆级图文详解

文章目录 前言1、计算机存储设备1.1、硬盘、内存、缓存1.2、金字塔结构1.3、数据流通过程 2、数据结构内存效率3、数据结构缓存效率 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0c;您的关注是我持续创作的…

【大数据】机器学习-----模型的评估方法

一、评估方法 留出法&#xff08;Holdout Method&#xff09;&#xff1a; 将数据集划分为训练集和测试集两部分&#xff0c;通常按照一定比例&#xff08;如 70% 训练集&#xff0c;30% 测试集&#xff09;。训练集用于训练模型&#xff0c;测试集用于评估模型性能。优点&…

人工智能-机器学习之多分类分析(项目实战二-鸢尾花的多分类分析)

Softmax回归听名字&#xff0c;依然好像是做回归任务的算法&#xff0c;但其实它是去做多分类任务的算法。 篮球比赛胜负是二分类&#xff0c;足球比赛胜平负就是多分类 识别手写数字0和1是二分类&#xff0c;识别手写数字0-9就是多分类 Softmax回归算法是一种用于多分类问题…