【shell】2、Makefile

文章目录

  • 一、变量
    • 1.1 定义简单变量
    • 1.2 定义数组
    • 1.3 引用变量
    • 1.4 规则中定义变量

一、变量

1.1 定义简单变量

变量名 = 值的语法来定义变量。这些变量可以用于存储命令、文件名、目录路径等信息,以便在Makefile规则中重复使用

# 定义一个变量
VAR_NAME = value# 定义多行变量(使用反斜杠 \ 进行换行)
MULTILINE_VAR = \line 1 \line 2 \line 3# 使用变量
target:@echo $(VAR_NAME)@echo $(MULTILINE_VAR)

示例如下:

ips = 192.168.2.1 192.168.2.99deploy:@echo $$ips# code result: (make deploy)
192.168.2.1 192.168.2.99

在上述示例中,VAR_NAME是一个简单的变量,存储着value的值。MULTILINE_VAR是一个多行变量,包含了三行文本。

target规则中,可以通过$(VAR_NAME)$(MULTILINE_VAR)来使用这些变量。echo命令将会输出变量的值。

请注意,变量名是大小写敏感的,在Makefile中使用变量时,需要使用$()${}将变量名包围起来。

定义变量时,可以使用=或者:=操作符。=是简单赋值操作符,而:=是覆盖前面定义的变量的操作符。

1.2 定义数组

在Makefile中,没有直接支持定义数组的语法。但是可以通过使用空格分隔的变量来模拟数组的行为。以下是一种常见的方法:

# 定义数组元素,使用空格分隔
ARRAY := element1 element2 element3# 使用数组元素
target:@echo $(ARRAY)@echo $(word 2, $(ARRAY))  # 访问数组中的特定元素# make target 的 code result
element2

示例如下:注意因为 for 被拆分为了多行,所以 for 里的每行要加分号;

ips = 192.168.2.1 192.168.2.99
deploy:for ip in $(ips); do \echo $$ip; \done# make deploy 的 code result
192.168.2.1
192.168.2.99

在上述示例中,ARRAY被定义为一个由空格分隔的元素列表。在target规则中,可以使用$(ARRAY)来输出整个数组。

如果想要访问数组中的特定元素,可以使用Makefile的函数来实现。在示例代码中,使用了$(word index, text)函数来获取数组中的第二个元素。

请注意,由于Makefile的变量只是简单的字符串替换,因此在使用数组元素时需要注意上下文。例如,在命令中使用数组元素时,应该将其用引号括起来以确保正确处理各个元素。

尽管这种方式可以模拟数组的行为,但是在 Makefile 中没有类似编程语言中的数组操作,例如追加元素、删除元素等。如果需要更复杂的数组操作,可能需要使用其他语言或工具来处理。

1.3 引用变量

在Makefile中,当你需要引用一个变量时,需要使用$$符号来转义它。这是因为Makefile中$符号有特殊含义,用于展开变量或执行命令替换。

以下是一些常见的情况,需要使用$$来引用变量:

  1. 在规则的命令中引用变量:
target:@echo $$VAR_NAME
  1. 在变量的值中引用其他变量:
VAR1 = value1
VAR2 = $(VAR1) value2

在上述示例中,通过$$VAR_NAME$(VAR1)来引用变量。

请注意,只有在Makefile的规则或变量的值中,需要引用变量时才需要使用$$。在其他地方,例如Makefile文件中的注释或普通文本中,不需要使用$$来引用变量。

确保在Makefile中正确使用$$转义符号来引用变量,以避免意外的展开或替换行为。

1.4 规则中定义变量

在Makefile中,你可以在 规则 中定义变量。这样定义的变量只在该步骤中有效,并且可以使用该步骤中的其他命令引用变量。

以下是一个示例:

target:@echo "Step 1"$(eval VAR_NAME := value)  # 在步骤中定义变量@echo "Step 2"@echo $(VAR_NAME)  # 在同一步骤中引用变量

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

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

相关文章

【医学大模型】MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化,便于LLM理解和应用

MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化,便于LLM理解和应用 提出背景对比传统医学大模型流程步骤临床指导树流程图识别临床决策支持系统 总结解决方案设计数据收集与处理系统实施临床决策支持 提出背景 论文:https://arxiv.org/p…

什么是DoS和DDoS攻击?

DoS和DDoS攻击是两种常见的网络攻击方式,它们通过向目标服务器发送大量的无效或高流量的网络请求,从而耗尽服务器的资源,使其无法正常处理有效的请求。 DoS攻击是一种单点攻击方式,通常是通过向目标服务器发送大量的请求&#x…

C语言---指针进阶

1.字符指针 int main() {char str1[] "hello world";char str2[] "hello world";const char* str3 "hello world.";const char* str4 "hello world.";if (str3 str4){//常量字符串在内存里面是无法修改的,所以没必要…

WordPress管理员修改自己用户名的插件Username

有一些站长在刚开搭建WordPress网站时,对于管理员的用户名是随意输入,后来想要修改时发现不懂得如何下手。其实,修改WordPress管理员用户名最快速的方法就是进入数据库直接修改,详见『通过phpMyAdmin直接修改WordPress用户名的图文…

裸辞5个月,面试了37家公司,终于找到理想工作了

上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈。 面试37次终于找到心仪工作 因为工作压力大、领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞,没想…

物联网水域信息化:水质监测智慧云平台

行业背景 由于传统水务企业水质监测和管理技术不足,以及水源污染等问题,确保供水水质达标困难重重。 且传统水务行业信息化手段单一,缺乏对大数据等新技术的应用,一定程度上影响了水务工作的精细化和智能化程度。 系统特点 为…

【plt.pie绘制饼图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【📊plt.pie绘制饼图】:从入门到精通,只需一篇文章!【Matplotlib可视化】! 利用Matplotlib进行数据可视化示例 🌵文章目录🌵 🎨 一、饼图初探:基本概念与用途&#x1f4a…

Python实现KDJ指标计算:股票技术分析的利器系列(3)

Python实现KDJ指标计算:股票技术分析的利器系列(3) 介绍算法解释 代码rolling函数介绍计算LLV(最低价最小值)和HHV(最高价最大值)计算RSV计算SMA(简单移动平均) 完整代码…

Linux——信号(1)

在我们使用Linux系统的时候我们经常会使用ctrl c的方式来终止进程,也 会使用kill命令来杀掉进程,评判进程退出的健康程度中也有信号的身影。那 么Linux中的信号到底是什么?今天就由我来介绍Linux中的信号。1. 信号的概念 要了解计算机中的信…

mysql在服务器中的主从复制Linux下

mysql在服务器中的主从复制Linux下 为什么要进行主从复制主从复制的原理主从复制执行流程操作步骤主库创建从库创建 测试 为什么要进行主从复制 在业务中通常会有情况,在sql执行时,将表锁住,导致不能进行查询,这样就会影响业务的…

DS:栈和队列的相互实现

创作不易,感谢友友们三连!! 一、前言 栈和队列的相互实现是用两个栈去实现队列或者是用两个队列去实现栈,这样其实是把问题复杂化的,实际中没有什么应用价值,但是通过他们的相互实现可以让我们更加深入地理…

vue的十大面试题详情

1 v-show与v-if区别 v-if与v-show可以根据条件的结果,来决定是否显示指定内容&#xff1a; v-if: 条件不满足时, 元素不会存在. v-show: 条件不满足时, 元素不会显示(但仍然存在). <div id"app"><button click"show !show">点我</but…

(2024,提示优化,监督微调,强化学习,近端策略优化)用于安全生成文本到图像的通用提示优化器

Universal Prompt Optimizer for Safe Text-to-Image Generation 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. 提议的框架 4. 实验 0. 摘要 文本-图像&a…

软件实例分享,酒店酒水寄存管理系统软件教程

软件实例分享&#xff0c;酒店酒水寄存管理系统软件教程 一、前言 以下软件教程以 佳易王酒水寄存管理系统软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、寄存的商品名称可以预先设置 2、寄存人可以使用手.机号识别 3、会员充值…

详解4大C语言内存函数【超详细建议点赞收藏】

目录 1. memcpy----内存拷贝1.1 函数介绍1.2 函数使用1.3 模拟实现 2. memmove----重叠内存的数据拷贝2.1 函数介绍2.2 函数使用2.3 模拟实现 3. memcmp----内存比较3.1 函数介绍3.2 函数使用 4.memset----内存设置4.1 函数介绍4.2 函数使用 注意&#xff1a;以下4个内存函数在…

Springboot医院信息管理系统源码 带电子病历和LIS Saas应用+前后端分离+B/S架构

目录 系统特点 技术架构 系统功能 1、 标准数据维护 2、 收费&#xff08;门诊/住院&#xff09;系统 3、 药剂管理系统 4、 医生工作站系统 5、 护士工作站系统 6、电子病历系统 系统优点 云HIS系统简介 云HIS系统功能模块 门急诊挂号管理 门诊收费管理 门诊医…

ansible剧本中的角色

1 roles角色 1.1 roles角色的作用&#xff1f; 可以把playbook剧本里的各个play看作为一个角色&#xff0c;将各个角色打的tasks任务、vars变量、template模版和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理&#xff0c;在需要的时候可在playbook中使…

直接选择排序算法

​​​​​​目录 选择排序 SelectSort直接选择排序 整体思路 图解分析 ​ 代码实现 时间复杂度 选择排序 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排…

【SV的面向对象 SV的类_2024.01.02】

OOP术语 OOP&#xff1a;object oriented programming Class类&#xff1a;包含变量和子程序的基本构建块 Object对象&#xff1a;类的一个实例 Handle句柄&#xff1a;指向对象的指针 Property属性&#xff1a;存储数据的变量&#xff1b;在V中&#xff0c;可以是wire或reg类…

NOTA-马来酰亚胺,1295584-83-6,可作为过渡金属离子的配体

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;NOTA-马来酰亚胺&#xff0c;NOTA Maleimide &#xff0c;NOTA-Mal&#xff0c;1295584-83-6 一、基本信息 产品简介&#xff1a;NOTA Maleimide, also known as NOTA maleimide, is a novel bifunctional integrat…