TIMESTAMP=$(shell date +%Y%m%d%H%M)
mkdir $(OUTPUT)/Myfile_$(TIMESTAMP)
其中踩得坑是在给变量TIMESTAMP赋值时,使用的是
TIMESTAMP=$(date +%Y%m%d%H%M)
导致TIMESTAMP一直为空。
这种方法在在shell中给变量赋值是可以的,可见makefile和shell的不同还是要注意区分。
利用date命令来获取时间,
用到以下几个选项
%Y表示年
%m表示月
%d表示日
%H表示小时
%M表示分钟
%S表示秒
%N表示纳秒
Makefile中利用shell的方式来给变量赋值的两种方法
一、 AA = $(shell pwd)
二、AA = `pwd`
第一种方法赋值是先执行shell命令,将命令运行的结果赋值
第二种方法赋值是先赋值(整个shell命令都当作字符来赋值),再执行命令
还要再总结下其他的如括号,花括号等。
参考文章:
https://blog.youkuaiyun.com/weixin_38890593/article/details/89711451
--------------------------------------------------------------------------------------------------
5、在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“; \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行,例如:
SUBDIR=src example
all:
@for subdir in $(SUBDIR); \
do\
echo "building "; \
done上述可以看出for循环中每行都是以”; \”结尾的。
Makefile与shell脚本区别
在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的。本文试着归纳一下Makefile和shell脚本的不同。
1、 shell中所有引用以$打头的变量其后要加{},而在Makefile中的变量是以$打头的后加()。实例如下:
Makefile
PATH="/data/"
SUBPATH=$(PATH)
Shell
PATH="/data/"
SUBPATH=${PATH}
2、Makefile中所有以$打头的单词都会被解释成Makefile中的变量。如果你需要调用shell中的变量(或者正则表达式中锚定句位$),都需要加两个$符号($$)。实例如下:
PATH="/data/"
all:
echo ${PATH}
echo $$PATH
例子中的第一个${PATH}引用的是Makefile中的变量,而不是shell中的PATH环境变量,后者引用的事Shell中的PATH环境变量。
3、通配符区别- HY doubt
shell 中通配符*表示所有的字符
Makefile 中通配符%表示所有的字符
4、在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的。比如如下代码就是没有任何输出:
VAR="Hello"
echo "$VAR"
all:
.....以上代码任何时候都不会输出,没有在target内,如果上述代码改为如下:
VAR="Hello"
all:
echo "$VAR"
.....以上代码,在make all的时候将会执行echo命令。
5、在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“; \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行,例如:
SUBDIR=src example
all:
@for subdir in $(SUBDIR); \
do\
echo "building "; \
done上述可以看出for循环中每行都是以”; \”结尾的。
6、获取当前目录
PATH=`pwd` 注意是``,不是''
http://blog.chinaunix.net/uid-20672257-id-3345593.html
-------------------------------------------------------------------------------------------------------------
makefile赋值中= := ?= += 的区别
= 是最基本的赋值 := 是覆盖之前的值 ?= 是如果没有被赋值过就赋予等号后面的值 += 是添加等号后面的值
1、“=” make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子: x = foo y = $(x) bar x = xyz 在上例中,y的值将会是 xyz bar ,而不是 foo bar 。 2、“:=” “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。 x := foo y := $(x) bar x := xyz 在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
------------------------------------------------------------------------------------------------------------------
Shell变量:Shell变量的定义、赋值和删除
http://c.biancheng.net/view/743.html
变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。
在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。
这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。
当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。
定义变量
Shell 支持以下三种定义变量的方式:
variable=value
variable='value'
variable="value"
variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的,稍后我们会详细说明。
注意,赋值号=
的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。
Shell 变量的命名规范和大部分编程语言都一样:
- 变量名由数字、字母、下划线组成;
- 必须以字母或者下划线开头;
- 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。
变量定义举例:
- url=http://c.biancheng.net/shell/
- echo $url
- name='C语言中文网'
- echo $name
- author="严长生"
- echo $author
使用变量 HY:shell使用变量时加花括号{}
使用一个定义过的变量,只要在变量名前面加美元符号$
即可,如:
- author="严长生"
- echo $author
- echo ${author}
变量名外面的花括号{ }
是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
- skill="Java"
- echo "I am good at ${skill}Script"
如果不给 skill 变量加花括号,写成echo "I am good at $skillScript"
,解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号{ }
,这是个良好的编程习惯。
修改变量的值
已定义的变量,可以被重新赋值,如:
- url="http://c.biancheng.net"
- echo ${url}
- url="http://c.biancheng.net/shell/"
- echo ${url}
第二次对变量赋值时不能在变量名前加$
,只有在使用变量时才能加$
。
单引号和双引号的区别
前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '
包围,也可以由双引号" "
包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:
- #!/bin/bash
- url="http://c.biancheng.net"
- website1='C语言中文网:${url}'
- website2="C语言中文网:${url}"
- echo $website1
- echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net
以单引号' '
包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。
以双引号" "
包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
我的建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。
将命令的结果赋值给变量
Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:
variable=`command`
variable=$(command) makefile中为variable=$(shell command)
第一种方式把命令用反引号` `
(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()
包围起来,区分更加明显,所以推荐使用这种方式。
例如,我在 demo 目录中创建了一个名为 log.txt 的文本文件,用来记录我的日常工作。下面的代码中,使用 cat 命令将 log.txt 的内容读取出来,并赋值给一个变量,然后使用 echo 命令输出。
[mozhiyan@localhost ~]$ cd demo [mozhiyan@localhost demo]$ log=$(cat log.txt) [mozhiyan@localhost demo]$ echo $log 严长生正在编写Shell教程,教程地址:http://c.biancheng.net/shell/ [mozhiyan@localhost demo]$ log=`cat log.txt` [mozhiyan@localhost demo]$ echo $log 严长生正在编写Shell教程,教程地址:http://c.biancheng.net/shell/
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
- #!/bin/bash
- myUrl="http://c.biancheng.net/shell/"
- readonly myUrl
- myUrl="http://c.biancheng.net/shell/"
运行脚本,结果如下:
bash: myUrl: This variable is read only.
删除变量
使用 unset 命令可以删除变量。语法:
- unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。
举个例子:
- #!/bin/sh
- myUrl="http://c.biancheng.net/shell/"
- unset myUrl
- echo $myUrl
上面的脚本没有任何输出。