经常有小伙伴会询问:我们写代码为啥需要写makefile,为啥需要掌握shell的基本用法?要想回答这两个问题,我们首先得了解,什么是makefile什么又是shell。
Makefile规则
1、make工具和Makefile文件
在linux系统下操作的时候,我们经常是在终端使用命令行来执行每个.c文件,例如:
gcc main.c -o main
但是随着我们的项目工程的需求越来越大,我们编写的代码也越来越多,其中所编译的.c文件的数量也就越来越多,此时如果我们想编译整体的一个文件,那么我就需要将所有的.c文件都在终端命令行里面敲一遍,如下所示,这样不仅费事费力,还容易引起年轻人的心脏病(狗头)。
gcc xxx1.c xxx2.c xxx3.c xxx4.c xxx5.c ... -o xxx
当然上面只是第一个原因,还有一个重要的原因是,当我们去修改某一个.c文件或者是.h文件的时候,如果像上述一下去执行一遍,那么整个工程文件都需要我们重新运行一遍,当我们的程序在linux开发板上运行的时候,我们整个工程文件如果稍微大一点,那么我们一旦对其中的一部分文件进行修改,那么要是整个代码段重新运行,那将要消耗大量的时间,makefile的好处就是我们代码在执行的时候,只会执行修改了的.c文件和修改了的.h文件下面对应的.c文件,省时省力!简直神器是也。
make:一般说的是GUN Make,是一个软件,用于将源代码文件编译成二进制文件,当然这个工具最重要的功能是完成自动化编译,make文件编译的时候需要makefile文件提供编译通道。
Makefile:make工具所使用的文件,Makefile指明了编译规则。
2、Makefile基本语法
首先了解一下Makefile的规则格式:
目标... : 依赖1 依赖2 依赖3......
命令1
命令2
......
举个例子:
main :xxx1.o xxx2.o xxx3.o ...
gcc xxx1.0 xxx2.0 xxx3.0 -o main
xxx1.o : xxx1.c
gcc -c xxx1.c
xxx1.o : xxx1.c
gcc -c xxx2.c
xxx1.o : xxx1.c
gcc -c xxx3.c
clean :
rm *.o -rf
rm main
implement :
./main
这就是一个简单的Makefile文件,有了这个文件,在更新以及执行的时候,我们会默认对第一条规则进行更新。
规则clean,他没有依赖文件,我们会默认他的依赖文件是最新的,所以不会执行。
3、Makefile变量
跟c语言一样,Makefile也支持变量,但是有一点区别,就是他不像c语言那样有很多种变量类型,他只有一种变量类型就是字符串!
main :xxx1.o xxx2.o xxx3.o ...
gcc xxx1.0 xxx2.0 xxx3.0 -o main
#Makefile 变量的使用
Objects = xxx1.o xxx2.o xxx3.o ...
main : $(Objects)
gcc $(Objects) -o main
4、= 、:=、?=三个赋值符的区别
name = lrh
curname = $(name)
name = luronghao
printf:
@echo curname: $(name)
大家可以猜一下此刻输出的是什么?
猜对啦!就是luronghao,那为啥呢?
赋值符=的神奇作用相当于借助另一个变量,将变量值推到后面去定义,也就是变量的真实值取决于引用变量最后一次时候变量此刻的有效值。
如果我们此时将=改成:=的,那么输出的值就会变成lrh,那是因为:=不会使用后面定义的变量,只会使用前面定义好的。
curname ?= luronghao
这句话可以完美的来阐述?=的作用:如果前面没有定义了curname那么我就将luronghao这个值赋给他,如果前面定义了,那么我就使用前面赋的值。
5、Makefile的模式规则与自动化变量
正如前面所说,在写Makefile文件的时候,会使用很多.o的目标文件,链接成可执行文件,每个.o都需要一条规则所对应的.c文件来生成。那么我们写的下面这些就会显得很冗长,这时候就需要模式规则和自动化变量了。
模式规则:
用%表示长度非空的任意字符串,类似于通配符
xxx1.o : xxx1.c
gcc -c xxx1.c
xxx1.o : xxx1.c
gcc -c xxx2.c
xxx1.o : xxx1.c
gcc -c xxx3.c
自动化变量:
xxx1.o : xxx1.c
gcc -c xxx1.c
xxx1.o : xxx1.c
gcc -c xxx2.c
xxx1.o : xxx1.c
gcc -c xxx3.c
%.o : %.c
gcc -c $< //可以用这个来代替上面的代码
Shell规则
1、Shell脚本
我们能够熟练的在终端中输入命令来完成一系列的常用操作,但是我们都是一条一条输入命令。这样会很麻烦,那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?当然有,这个就是shell脚本!
Shell脚本类似于windows下面的批处理文件,shell脚本是将连续执行的命令写成一个文件。
Shell脚本提供数组、循环、条件判断等功能。
2、Shell脚本的写法
Shell脚本是一个纯文本文件,命令从上而下,一行一行的开始执行。Shell脚本扩展名为.sh。
Shell脚本的第一行一定要为:
#!bin/bash
具体bash命令
简单的输入输出的Shell脚本
#!bin/bash
echo "Please input your name:"
read name
echo:your name is : $(name)
#!bin/bash
read -P "Please input your age and height:" age height
echo:your age is : $(age), your height is : $(height)
Shell仅支持整形数值计算,使用整形数值计算应使用$((表达式))。
#!bin/bash
echo "Please input two numbers:"
read -P "the first number is:" first
read -P "the second number is:" second
total=$(($first + $second))
echo "$(total) = $(first) + $(second)"
3、test命令
test 命令用于查看文件是否存在、权限等信息,可以进行数值,字符,文件三方面的测试。
4、&&和||命令
cmd1 && cmd2 当 cmd1 执行完并且正确,那么 cmd2 开始执行,如果 cmd1 执行完毕错
误,那么cmd2 不执行。“
cmd1 || cmd2 当cmd1执行完毕并正确,那么cmd2 不执行,反之cmd2执行。
#!bin/bash
echo "Please input filename:"
read -P "filename:" filename
test -e $filename && echo "filename exist" || echo "filename is not existed"
5、[ ]命令
内部可以使用==或者!=
#!bin/bash
echo "Please input two string"
read -P "the first string:" first_string
read -P "the second string:" second_string
[ "$first_string" == "$second_string" ] && echo "the first string = the second string" || echo "the first string != the second string"
6、Shell脚本条件判断、函数
a、if-else语句
#!bin/bash
read -P "Please input (Y/N):" value
if[ "$value" == "Y" ] || [ "$value" == "y" ]; then
echo "xxxxxxx"
fi
if[ "$value" == "N" ] || [ "$value" == "n" ]; then
echo "xxxxxxx"
fi
b、case语句
#!bin/bash
case $s in
"a")
echo "param is : a"
;;
"b")
echo "param is : b"
;;
echo "can't be identified!"
;;
esac
c、for循环的两种用法
第一种:
#!bin/bash
for name in zzk1 zzk2 zzk3
do
echo "your name is : $name"
done
第二种:
#!bin/bash
read -P "Please input count:" count
total=0
for(i=0; i<=count; i++)
$total=$(($total + $i))
done
echo "1+2+3+...+$count = $total"
当然了以上只是介绍了一下Makefile和Shell的基本概念和用法,如果你对更深层次的知识感兴趣,你可以去阅读相关书籍来探索更多有趣的使用情况,好了本期的内容就到这里,如果您觉得这篇文章对您有一定的帮助,恳请各位观众老爷动动小手给我点一个小小的赞,您的鼓励是我前进最大的动力,我们下期再见!