【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,一经查实,立即删除!

相关文章

Vue练习5:图片的引入

后续会补充 1.require引入 src -> asstes <template><img :src"url"> </template><script> export default {name: App,data(){return{url: require("./assets/logo.png"),}} } </script> 2.import引入 src…

Vue2:Vuex中使用mapState和mapGetters

一、情景说明 前面的Vuex案例中 我们在使用state中的变量或者getter中的变量时 使用插值语法&#xff0c;写法如下&#xff1a; <h1>当前求和为&#xff1a;{{$store.state.sum}}</h1><h1>当前求和放大10倍为&#xff1a;{{$store.getters.bigSum}}</h1&…

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

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

什么是DoS和DDoS攻击?

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

【c/c++】C++静态工具类和单例模式对比学习

文章目录 序言1. static静态成员2. C(伪)静态工具类3. 单例模式3.1 单例模式的特点3.2 单例模式的实现方式3.3 单例模式的缺点3.4 Meyer Singleton单例模式 4. (伪)静态工具类 vs 单例模式4.1 区别4.2 如何选择4.3 一些释疑 序言 比较C static&#xff08;伪&#xff09;静态&a…

在k8s中,使用DirectPV CSI作为分布式存储的优缺点

DirectPV 提供了一种直接将物理卷(Physical Volumes)与 Kubernetes 集群中的 Pod 绑定的机制。 利用 DirectPV,你可以将相应的 PV 直接与节点上的物理存储设备(如磁盘)进行绑定,而无需通过网络存储服务(如 NFS 或 Ceph)来提供存储。这种直接访问物理卷的方式,有助于提…

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){//常量字符串在内存里面是无法修改的&#xff0c;所以没必要…

springboot/ssm校园菜鸟驿站管理系统Java校园快递取件管理系统

springboot/ssm校园菜鸟驿站管理系统Java校园快递取件管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.…

这是 30 年来创办公司的最佳时机(下篇)

有些很聪明的人没什么成就,主要的原因是不愿意做基础性重复性的工作。 他们有个毛病,一旦达到某个状态,了解了事情的本质,就不愿意再重复去做了。所以,最后她们只能当参谋一样的角色。 真正能做成事情的人,都是能到一线去执行的。要是你聪明、又能干,那成为大才的概率很…

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

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

linux 环境下使用gsettings更改alt+tab切屏模式

Linux 操作系统配置 dconf是GNOME3的注册表&#xff0c;可以通过改变dconf中value的值来改变配置&#xff0c;有两种配置方法。第一种是通过可视化GUI dconf-editor进行配置&#xff0c;第二种是通过gsettings command line的方式改变dconf注册表中的value来设置。 dconf-edit…

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

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

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

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

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

【&#x1f4ca;plt.pie绘制饼图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib可视化】&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f3a8; 一、饼图初探&#xff1a;基本概念与用途&#x1f4a…

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

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

Linux——信号(1)

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

「优选算法刷题」:连续数组

一、题目 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或…

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

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

DS:栈和队列的相互实现

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

vue的十大面试题详情

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