大家都知道在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的。本文试着介绍一下Makefile和shell脚本的不同。

1、在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的。比如如下代码就是没有任何输出:

VAR="Hello"

echo "$VAR"

all: .....

以上代码任何时候都不会输出,没有在target内,如果上述代码改为如下:

VAR="Hello"

all:

echo "$VAR" .....

以上代码,在make all的时候将会执行echo命令。

2、在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“;  \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行,例如:

SUBDIR=src example

all:

@for subdir in $(SUBDIR); \

do\

echo "building "; \

done

上述可以看出for循环中每行都是以”; \”结尾的。

3、Makefile中所有以$打头的单词都会被解释成Makefile中的变量。如果你需要调用shell中的变量(或者正则表达式中锚定句位$),都需要加两个$符号($$)。实例如下:

PATH="/data/"

all:

echo ${PATH}

echo $$PATH

例子中的第一个${PATH}引用的是Makefile中的变量,而不是shell中的PATH环境变量,后者引用的事Shell中的PATH环境变量。

以上三点的是Makefile调用shell应该注意的地方,写Makefile一定要注意。

shell脚本条件判断

UNIX Shell 编程中条件判断是极为重要的,以下是常用的条件判断:

-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且是一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符合链接,则为真
-k file 若文件存在且设置了”sticky”位的值
-p file 若文件存在且为一已命名管道,则为真
-r file 若文件存在且可读,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真

-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真

int1 -eq int2 若int1等于int2,则为真
int1 -ne int2 若int1不等于int2,则为真
int1 -lt int2 若int1小于int2,则为真
int1 -le int2 若int1小于等于int2,则为真
int1 -gt int2 若int1大于int2,则为真
int1 -ge int2 若int1大于等于int2,则为真

!expr 若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2 若expr1和expr2都为真则整式为真
expr1 -o expr2 若expr1和expr2有一个为真则整式为真

特殊变量

$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…)
$# 提供脚本的参数号
$* 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@ 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2
$? 前一个命令执行后的退出状态
$$ 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$! 前一个后台命令的进程号

Shell函数
mylog() {

echo "[`date '+%F %T'`] [ $2.$1 ] $3" >> $4
}

s_time=`date +%s`
s_curren_dir=$(pwd)
s_logfile=$s_curren_dir/log/install.log.`date '+%Y%m%d'`
logID=001
mylog "$s_time" "$logID" "your messager." "$s_logfile" #shell脚本中函数的调用不能用(),并且参数使用空格分隔,不是符合一般的习惯

在这自定义函数我没试过,操一段

其实定义起来很简单, 没有我想象中的 def, command, function 之类的关键字, 而是等同于变量定义, 下面是尝试在实际项目中使用的函数定义:

[zrf@DMLinux pes]$ cat Makefile.common
# The following function make the input token uniq.
# the token may be not in the input order
# usage: uniq_result=$(call uniq, A B A B B C)
# expected result: uniq_result is A B C
uniq=$(shell echo $1 | sed 's/[ \t]\+/\n/g' | sed 's/^/ /' | sort -u | tr -d '\n')

# The following function link the -lnet* and -lwrap library statically while
# keep other libraries being link dynamically by wrapping the -lxxx option with
# -Wl,-Bstatic ... -Wl,-Bdynamic
link_some_lib_staticlly=$(shell echo $1 | sed 's/-l\(net[^ \t]*\|wrap\)\( -l\(net[^ \t]*\|wrap\)\)*/-Wl,-Bstatic & -Wl,-Bdynamic/g')

自定义函数的关键是一定要用=号, 而不是:=, :=与=的差别是:=是即时求值, =则是使用时才求值. 把:看作一个站着的小人, :=可以看作"立等可取"来助记.

命令定义中可以用$1, $2, $3来引用传递的参数, 注释里已经有了自定义函数的使用
call是个特殊的make函数, 用于调用其它函数, 参数以逗号分隔.

借助这种方法, 可以让那些频繁而又重复的操作被封装进一个函数里, 不需要到处复制, DRY远处不在.

上面这两个自定义函数的功能是:
让 LDLIBS这样的变量中内容精简, 同时能灵活地指定某个库是以静态方式链接到最终可执行文件里, 而多数其它的常用库, 如libc仍保持是动态链接.自:http://blog.chinaunix.net/u/8681/showart_2228861.html

转载于:https://www.cnblogs.com/yxw5/p/3383798.html

Makefile和shell脚本调用上的一些总结相关推荐

  1. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  2. Makefile与shell脚本区别

    在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着归纳一下Makefile和shell脚本的不同. 1. shell中所有引用以$打头的变量其后要加{}, ...

  3. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  4. 使用shell脚本调用mysql数据库存储过程,并设置定时任务

    本来是要mysql数据库中创建事件任务来,定时执行存储过程,做数据传输的...后来由于种种原因,就使用crontab来定时执行,调用存储过程. 实现这个数据传输分为两步: 第一步:编写shell脚本调 ...

  5. shell脚本调用Madagascar软件自动画三维图

    shell脚本调用Madagascar软件自动画三维图 代码如下 echo "in=\"$1\"" > grey3_tmp.rsf echo " ...

  6. 如何从另一个Shell脚本调用Shell脚本?

    我有两个shell脚本a.sh和b.sh . 我怎么能叫b.sh从shell脚本中a.sh ? #1楼 看一下这个. #!/bin/bash echo "This script is abo ...

  7. shell调用python获取返回值_[linux的shell脚本调用python脚本的返回值][shell调python][ubuntu的shell调用python脚本得到返回值]...

    最近搞个东西,需要写shell脚本,但在shell脚本里需要调用python并得到变量值,网上找了很多都是python调shell的,最后请教了一下郭总 知道了sys.argv的用法后才搞定了,在此感 ...

  8. 编写shell脚本-sftp上传文件

    先简单的写一下shell脚本的流程. #创建一个sh文件 nano yulisao.sh #编写shell脚本命令 # 略,根据自己需要编写.示例如下 #! /bin/sh echo "请输 ...

  9. shell脚本判断上一个命令是否执行成功

    shell脚本中判断上一个命令是否执行成功 shell中使用符号"$?"来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败. 结合if-else语句实现判断上一个命 ...

最新文章

  1. 寻找孪生素数(当p为素数时,p+2也为素数)
  2. 【转】无法将notepad++添加到打开方式列表中的解决办法
  3. php视图,thinkPHP框架中视图的讲解(附代码)
  4. chrome浏览器开发模式实现跨域
  5. fsk调制解调实验报告 matlab,基于MATLAB的-FSK调制与解调-通信原理实验
  6. 光流估计——从传统方法到深度学习
  7. JSK-27321 统计单词数【字符串】
  8. 如何在 Mac 上的 Pages 文稿中格式化文本栏?
  9. 中原建业在港上市首日破发,基石投资者祥来及楼公望亏780万港元
  10. (转载)北上广深房价只会涨不会降
  11. STM32F105 实现USB BULK传输
  12. 用modprobe 加载模块时,提示模块找不到的问题
  13. L3-020 至多删三个字符 (30分)(动态规划)
  14. java版VR全景漫游制作平台 - 1介绍
  15. Tik Tok品牌营销,如何做好内容打法
  16. Allegro Shape菜单详解
  17. 科普大佬说 | 港大黄凯斌老师带你解锁黑客帝国与6G的关系
  18. python android开发月薪_同事逆袭面进阿里P7 年薪60W+,临别留下一张Android开发重点技术路线图…...
  19. 登陆页面的获取验证码
  20. 《麦肯锡方法》读完后的千字感悟

热门文章

  1. typora 公式_如何用Typora写Markdown上传至知乎
  2. c语言goto语句用法_硬件工程师必知的10个C语言技巧
  3. 支持向量机python代码_支持向量机及python实现(一)
  4. matlab 置顶曲线,matlab figure 最大,最小,置顶
  5. 在此iphone上尚未受信任_电脑显示服务器上的安全数据库没有此工作站信任关系的解决方法...
  6. mongodb 数字 _id_MongoDB学习笔记MongoDB简介及数据类型
  7. python画父子关系图_将有父子关系的一维数组转换成树形结构(多维)数据
  8. 最受欢迎的男友职业排行榜 Top10 ,程序员排第 3
  9. 一文带你学C语言,详细知识点思维导图!
  10. vant 动态 粘性布局_CSS Viewport 单位,很多人还不知道使用它来快速布局!