`

shell脚本及makefile中的特殊变量

 
阅读更多

shell脚本中的特殊变量

1. $# 传递到脚本的参数个数

2. $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
3. $$ 脚本运行的当前进程ID号
4. $! 后台运行的最后一个进程的进程ID号
5. $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
6. $- 显示shell使用的当前选项,与set命令功能相同

7. $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$0 脚本名字
$1 位置参数 #1
$2 - $9 位置参数 #2 - #9
${10} 位置参数 #10
$# 位置参数的个数
"$*" 所有的位置参数(作为单个字符串) *
"$@" 所有的位置参数(每个都作为独立的字符串)
${#*} 传递到脚本中的命令行参数的个数
${#@} 传递到脚本中的命令行参数的个数
$? 返回值
$$ 脚本的进程ID(PID)
$- 传递到脚本中的标志(使用set )
$_ 之前命令的最后一个参数
$! 运行在后台的最后一个作业的进程ID(PID)

makefile中的自动化变量

下面对所有的自动化变量进行说明:

$@

表示规则的目标文件名。如果目标是一个文档文件( Linux 中,一般称 .a 文件为文档文件,也称为静态库文件),那么它代表这个文档的文件名。在多目标模式规则中,它代表的是哪个触发规则被执行的目标文件名。

$%

当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是“ foo.a(bar.o) ”,那么,“ $% ”的值就为“ bar.o ”,“ $@ ”的值为“ foo.a ”。如果目标不是静态库文件,其值为空。

$<

规则的第一个依赖文件名。如果是一个目标文件使用隐含规则来重建,则它代表由隐含规则加入的第一个依赖文件。

$?

所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员( .o 文件)。

$^

规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有库成员( .o 文件)名。一个文件可重复的出现在目标的依赖中,变量“ $^ ”只记录它的一次引用情况。就是说变量“ $^ ”会去掉重复的依赖文件。

$+

类似“ $^ ”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。

$*

在模式规则和 静态模式规则 中,代表“茎”。“茎”是目标模式中“ % ”所代表的部分(当文件名中存在目录时,“茎”也包含目录(斜杠之前)部分)。例如:文件“ dir/a.foo.b ”,当目标的模式为“ a.%.b ”时,“ $* ”的值为“ dir/a.foo ”。“茎”对于构造相关文件名非常有用。

自动化变量“ $* ”需要两点说明:

?         对于一个明确指定的规则来说不存在“茎”,这种情况下“ $* ”的含义发生改变。此时,如果目标文件名带有一个可识别的后缀,那么“ $* ”表示文件中除后缀以外的部分。例如:“ foo.c ”则“ $* ”的值为:“ foo ”,因为 .c 是一个可识别的文件后缀名。 GUN make 对明确规则的这种奇怪的处理行为是为了和其它版本的 make 兼容。通常,在除静态规则和模式规则以外,明确指定目标文件的规则中应该避免使用这个变量。

?         当明确指定文件名的规则中目标文件名包含不可识别的后缀时,此变量为空。

自动化变量“ $? ”在显式规则中也是非常有用的,使用它规则可以指定只对更新以后的依赖文件进行操作。例如,静态库文件“ libN.a ”,它由一些 .o 文件组成。这个规则实现了只将更新后的 .o 文件加入到库中:

 

      lib: foo.o bar.o lose.o win.o

              ar r lib $?

 

以上罗列的自动量变量中。其中有四个在规则中代表文件名( $@ $< $% $* )。而其它三个的在规则中代表一个文件名列表。 GUN make 中,还可以通过这七个自动化变量来获取一个完整文件名中的目录部分和具体文件名部分。在这些变量中加入“ D ”或者“ F ”字符就形成了一系列变种的自动环变量。这些变量会出现在以前版本的 make 中,在当前版本的 make 中,可以使用“ dir ”或者“ notdir ”函数来实现同样的功能。

$(@D)

表示目标文件的目录部分(不包括斜杠)。如果“ $@ ”是“ dir/foo.o ”,那么“ $(@D) ”的值为“ dir ”。如果“ $@ ”不存在斜杠,其值就是“ . ”(当前目录)。注意它和 函数“ dir 的区别!

$(@F)

目标文件的完整文件名中除目录以外的部分(实际文件名)。如果“ $@ ”为“ dir/foo.o ”,那么“ $(@F) ”只就是“ foo.o ”。“ $(@F) ”等价于函数“ $(notdir $@) ”。

$(*D)

$(*F)

分别代表目标“茎”中的目录部分和文件名部分。

$(%D)

$(%F)

当以如“ archive(member) ”形式静态库为目标时,分别表示库文件成员“ member ”名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。

$(<D)

$(<F)

分别表示规则中第一个依赖文件的目录部分和文件名部分。

$(^D)

$(^F)

分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。

$(+D)

$(+F)

分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。

$(?D)

$(?F)

分别表示被更新的依赖文件的目录部分和文件名部分。

 

在讨论自动化变量时,为了和普通变量(如:“ CFLAGS ”)区别,我们直接使用了“ $< ”的形式。这种形式仅仅是为了和普通变量进行区别,没有别的目的。其实对于自动环变量和普通变量一样,代表规则第一个依赖文件名的变量名实际上是“ < ”,我们完全可以使用“ $(<) ”来替代“ $< ”。但是在引用自动化变量时通常的做法是“ $< ”,因为自动化变量本身是一个特殊字符。

GUN make 同时支持“ Sysv ”特性,允许在规则的依赖列表中使用特殊的变量引用(一般的自动化变量只能在规则的命令行中被引用)“ $$@ ”、“ $$(@D) ”和“ $$(@F) ”(注意:要使用“ $$ ”),它们分别代表了“目标的完整文件名”、“目标文件名中的目录部分”和“目标的实际文件名部分”。这三个特殊的变量只能用在明确指定目标文件名的规则中或者是静态模式规则中,不用于隐含规则中。另外 Sysv make GNU make 对规则依赖的处理也不尽相同。 Sysv make 对规则的依赖进行两次替换展开,而 GUN make 对依赖列表的处理只有一次,对其中的变量和函数引用直接进行展开。

自动化变量的这个古怪的特性完全是为了兼容 Sysv  版本的 makefile 文件。在使用 GNU make 时可以不考虑这个,也可以在 Makefile 中使用伪目标“ .POSIX ”来禁止这一特性。

分享到:
评论

相关推荐

    shell脚本与Makefile区别.docx

    "shell脚本与Makefile区别" shell 脚本和 Makefile 是两个不同的工具,它们都用于自动化构建和编译过程,但是它们有很大的不同之处。本文将详细介绍 shell 脚本和 Makefile 的区别。 首先,shell 脚本和 Makefile ...

    一个学习Shell、脚本和Makefile的好资料

    【描述】: 这份资料适用于学习Shell脚本和Makefile,特别适合在操作系统课程中使用。它深入介绍了Shell,并提供了丰富的实践内容。 【标签】: 命令行学习,脚本学习 【内容】: 在学习操作系统的过程中,掌握Shell...

    Makefile自动化脚本,运行该脚本可直接自动生成Makefile文件

    在给定的场景中,`AutoMake.sh`是一个Shell脚本,用于自动创建Makefile文件,使得用户在编写C语言程序时,可以更加便捷地管理和构建项目。 1. **Makefile基本结构**:Makefile通常包含目标(target)、依赖文件...

    shell脚本+ant脚本

    Shell脚本和Ant脚本是两种在IT行业中广泛使用的自动化工具,主要应用于Unix/Linux系统和Java项目的构建。这里我们将深入探讨这两个概念以及它们在实际工作中的应用。 首先,Shell脚本是基于Unix/Linux命令行环境的...

    shell-and-Makefile.rar_makefile_makefile shell_shell_shell Makef

    在Linux开发过程中,掌握Makefile和Shell脚本的编写至关重要,因为它们是高效自动化任务执行的核心工具。Makefile用于组织和编译项目,而Shell脚本则是Linux系统中执行批处理任务和系统管理的常用手段。 **Makefile...

    18. Linux开发-Makefile规则与Shell脚本语言.pdf

    在Linux开发中,掌握Makefile规则和Shell脚本语言是非常重要的技能。让我们深入探讨这些知识点。 首先,关于静态库和动态库,静态库(.a文件)在编译时会将相关的函数代码直接链接到目标程序中,形成一个独立的可...

    Shell脚本专家指南

    此外,书中还可能包含对流行的Shell脚本调试工具、版本控制工具(如Git)在脚本中的应用,以及如何使用Makefile来组织和编译复杂的Shell项目等内容。 总之,“Shell脚本专家指南”是一本全面的教程,无论你是新手...

    嵌入式实验, ,实验一:shell 脚本程序设计.doc

    Shell脚本是Linux或Unix系统中用于自动化任务的一种强大工具。在实验一中,你需要掌握以下知识点: 1. **Shell基础**:了解Bash Shell的基本语法,如变量赋值、条件语句(if-else)、循环(for, while)和函数定义...

    Linux makefile 和shell文件相互调用实例详解

    在实际应用中,我们经常需要从一个Shell脚本中调用Makefile来完成特定的任务,比如编译项目或者安装软件包。下面是一个简单的示例: ```bash #!/bin/bash cd template-2.1 ./configure sudo make -f install cd ../...

    shell自动化构建脚本

    shell脚本是Unix/Linux系统中的一种命令行解释器,用于执行一系列命令,实现任务的自动化。在本文中,我们将深入探讨shell自动化构建脚本的核心概念、用途、以及如何创建和使用它们。 一、shell脚本简介 Shell脚本...

    Makeile以及SHELL脚本的编写,本人工作中所总结的

    在软件开发中,Makefile常用来调用SHELL脚本执行复杂的任务。例如,一个Makefile可能包含一个规则,该规则调用一个SHELL脚本来执行测试、格式化代码或打包操作。这样,通过Makefile可以集中管理和控制整个项目生命...

    makefile中文手册(200页pdf文档)

    - **Makefile** 是一种脚本文件,主要用于自动化构建程序或管理软件项目中的编译任务。 - **GNU Make** 是最常用的 Make 实现之一,广泛应用于 Linux 和 Unix 系统。 #### 二、Makefile 规则 - **规则** 定义了如何...

    ubuntu下编程工具(shell脚本).pdf

    在Linux系统中,编写和运行shell脚本是一种非常常见的操作,它大大简化了对系统及应用程序的管理。 最后,文档提及了Linux环境下的集成开发环境。虽然Linux下的开发工作多数通过命令行完成,但也有集成开发环境可供...

    Android开发系统shell常用脚本

    - **变量**:在Shell脚本中,可以定义并使用变量来存储数据,如路径、文件名等。 - **条件语句**:`if`, `else if`, `else` 结构用于根据不同的条件执行不同的命令。 - **循环语句**:`for` 和 `while` 循环结构...

    Linux环境下makefile脚本的编写

    ### Linux环境下makefile脚本的编写 在软件开发过程中,特别是在Linux环境中,随着项目规模的扩大,源代码文件数量的增加,如何有效地管理和自动化构建项目成为了一项重要的任务。这时候,makefile脚本就显得尤为...

    makefile shell

    在IT行业中,`Makefile`和`Shell`是两种非常重要的工具,它们分别用于构建自动化编译和执行任务,以及操作系统级别的命令行脚本编写。`Makefile`是GNU Make的配置文件,它定义了一系列规则来编译、链接源代码,而`...

    Makefile中文教程

    - 避免在命令行中进行复杂的逻辑运算,考虑将逻辑移到单独的shell脚本。 9. **Makefile调试** - 使用`-d`选项查看Makefile的执行过程,了解依赖关系的解析和命令的执行顺序。 - `make --print-data-base`可显示...

    Makefile中文手册.zip

    Makefile还包含了一些特殊的变量,如`CC`(C编译器)、`CFLAGS`(C编译选项)等,可以通过设置这些变量来改变编译行为。 此外,Makefile中的伪目标(Phony Target)如`.PHONY`,用于标记那些实际上并不存在的文件,...

    Makefile写法及自动化工具

    两者都是文本文件,都可以执行Shell命令和定义变量,但解释器不同,Shell脚本由Shell解释,而Makefile由make解释。此外,Makefile以规则为基础,而Shell脚本以命令行为基础。Makefile的优势在于它可以自动追踪文件...

Global site tag (gtag.js) - Google Analytics