Shell script & Make

Shell script和Makefile


Shell Script

我们已经编写过简单的Shell,其就是与系统沟通的工具,而Shell script则是利用Shell的语法和命名,并搭配正则表达式、管道等功能实现的纯文本文件,由Shell去解释执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# test.h

my_name="xzy"

echo $my_name

#readonly variable
readonly my_name
#can not use like this
# my_name="xxx"

#delete this variable,
#but still can not do like this
#cause my_name is readonly varible
# unset my_name

#string variable
str_1='my name is \"xzy\"'
str_2="my name is \"xzy\""
echo $str_1
echo $str_2

#string join
str_3="hello,$str_2"
echo $str_3

#string length
echo ${#str_3}

#get substring
#first variable is start
#second variable is the length of substring
echo ${str_3:18:3}

#search substring
#find the first index of x,z or y
echo `expr index "$str_3" xzy`

#array
val_1=1
val_2=2
val_3=3
array=($val_1,$val_2,$val_3)

#get all elements
echo ${array[@]}

#get length of array
echo ${#array[*]}

#get parameter pass to shell script
#$0 is file's name
echo $0
echo $1
#$# is count of parameter
echo $#
#$$ is progress'ID
echo $$

#process control
if test $str_3 = $str_2
then
echo "same"
else
echo "diff"
fi

for var in array
do
echo $var
done

#function
func(){
echo "function"
echo $1
}

func xzy

#include file
. ./test_2.sh

echo $url
1
2
#test_2.sh
url="123xzy.github.com"

上面基本上囊括了Shell script的基本用法,除了一些变量比较的命令没有列出来,要熟练掌握,主要还是要不断书写、练习

Makefile

1
2
3
4
target ... : prerequisites ...
            command
            ...
            ...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Students' Makefile for the Malloc Lab
#
TEAM = bovik
VERSION = 1
HANDINDIR = /afs/cs.cmu.edu/academic/class/15213-f01/malloclab/handin

CC = gcc
CFLAGS = -Wall -O2 -m32 -g

OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o

mdriver: $(OBJS)
$(CC) $(CFLAGS) -o mdriver $(OBJS)

mdriver.o: mdriver.c fsecs.h fcyc.h clock.h memlib.h config.h mm.h
memlib.o: memlib.c memlib.h
mm.o: mm.c mm.h memlib.h
fsecs.o: fsecs.c fsecs.h config.h
fcyc.o: fcyc.c fcyc.h
ftimer.o: ftimer.c ftimer.h config.h
clock.o: clock.c clock.h

handin:
cp mm.c $(HANDINDIR)/$(TEAM)-$(VERSION)-mm.c

clean:
rm -f *~ *.o mdriver

在默认的方式下,也就是我们只输入make命令。那么,

  • make会在当前目录下找名字叫“Makefile”或“makefile”的文件
  • 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“mdriver”这个文件,并把这个文件作为最终的目标文件
  • 如果“mdriver”文件不存在,或是“mdriver”所依赖的后面的.o 文件的文件修改时间要比edit这个文件新,那么他就会执行后面所定义的命令来生成“mdriver”这个文件
  • 如果“mdriver”所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件