Makefile和shell脚本调用上的一些总结
大家都知道在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脚本调用上的一些总结相关推荐
- 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)
大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...
- Makefile与shell脚本区别
在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着归纳一下Makefile和shell脚本的不同. 1. shell中所有引用以$打头的变量其后要加{}, ...
- 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?
一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...
- 使用shell脚本调用mysql数据库存储过程,并设置定时任务
本来是要mysql数据库中创建事件任务来,定时执行存储过程,做数据传输的...后来由于种种原因,就使用crontab来定时执行,调用存储过程. 实现这个数据传输分为两步: 第一步:编写shell脚本调 ...
- shell脚本调用Madagascar软件自动画三维图
shell脚本调用Madagascar软件自动画三维图 代码如下 echo "in=\"$1\"" > grey3_tmp.rsf echo " ...
- 如何从另一个Shell脚本调用Shell脚本?
我有两个shell脚本a.sh和b.sh . 我怎么能叫b.sh从shell脚本中a.sh ? #1楼 看一下这个. #!/bin/bash echo "This script is abo ...
- shell调用python获取返回值_[linux的shell脚本调用python脚本的返回值][shell调python][ubuntu的shell调用python脚本得到返回值]...
最近搞个东西,需要写shell脚本,但在shell脚本里需要调用python并得到变量值,网上找了很多都是python调shell的,最后请教了一下郭总 知道了sys.argv的用法后才搞定了,在此感 ...
- 编写shell脚本-sftp上传文件
先简单的写一下shell脚本的流程. #创建一个sh文件 nano yulisao.sh #编写shell脚本命令 # 略,根据自己需要编写.示例如下 #! /bin/sh echo "请输 ...
- shell脚本判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号"$?"来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败. 结合if-else语句实现判断上一个命 ...
最新文章
- 寻找孪生素数(当p为素数时,p+2也为素数)
- 【转】无法将notepad++添加到打开方式列表中的解决办法
- php视图,thinkPHP框架中视图的讲解(附代码)
- chrome浏览器开发模式实现跨域
- fsk调制解调实验报告 matlab,基于MATLAB的-FSK调制与解调-通信原理实验
- 光流估计——从传统方法到深度学习
- JSK-27321 统计单词数【字符串】
- 如何在 Mac 上的 Pages 文稿中格式化文本栏?
- 中原建业在港上市首日破发,基石投资者祥来及楼公望亏780万港元
- (转载)北上广深房价只会涨不会降
- STM32F105 实现USB BULK传输
- 用modprobe 加载模块时,提示模块找不到的问题
- L3-020 至多删三个字符 (30分)(动态规划)
- java版VR全景漫游制作平台 - 1介绍
- Tik Tok品牌营销,如何做好内容打法
- Allegro Shape菜单详解
- 科普大佬说 | 港大黄凯斌老师带你解锁黑客帝国与6G的关系
- python android开发月薪_同事逆袭面进阿里P7 年薪60W+,临别留下一张Android开发重点技术路线图…...
- 登陆页面的获取验证码
- 《麦肯锡方法》读完后的千字感悟
热门文章
- typora 公式_如何用Typora写Markdown上传至知乎
- c语言goto语句用法_硬件工程师必知的10个C语言技巧
- 支持向量机python代码_支持向量机及python实现(一)
- matlab 置顶曲线,matlab figure 最大,最小,置顶
- 在此iphone上尚未受信任_电脑显示服务器上的安全数据库没有此工作站信任关系的解决方法...
- mongodb 数字 _id_MongoDB学习笔记MongoDB简介及数据类型
- python画父子关系图_将有父子关系的一维数组转换成树形结构(多维)数据
- 最受欢迎的男友职业排行榜 Top10 ,程序员排第 3
- 一文带你学C语言,详细知识点思维导图!
- vant 动态 粘性布局_CSS Viewport 单位,很多人还不知道使用它来快速布局!