配置vim编辑器
设置一个tab键为4个空格
打开/etc/vim/vimrc文件,此文件为只读,所以要用sudo访问boot权限:
set ts=4(设置一个tab键为4空格)
set nu(vim编辑器下显示行号)
gcc编译器
gcc命令
gcc -c main.c(只编译不链接为可执行文件,将main.c文件编译为.o的目标文件)
gcc main.c -o main(-o表示将main.c编译为可执行文件main,如果不加-o,默认编译为a.out的可执行文件)
gcc的编译流程:预处理、编译、汇编和链接。预处理就是对程序中的宏定义等相关的内容先进行前期的处理。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件。
make工具和Makefile文件
当源码文件比较多的时候就不适合通过直接输入gcc命令来编译,这时候就需要一个自动化的编译工具。
make:一般说GNU Make,是一个软件,用于将源代码文件编译为可执行的二进制文件,make工具主要用于完成自动化编译,make工具编译的时候需要makefile文件提供编译文件。
Makefile:make工具所使用的文件,Makefile指明了编译规则。
Makefile规则格式
Makefile里面是由一系列的规则组成,这些规则格式如下:
下面的规则的目标是main,main.o、input.o和calcu.o是生成main的依赖文件,如果要更新目标main,就必须要先更新它的所有依赖文件,如果依赖文件中的如何一个有更新,那么目标文件也必须更新,"更新"就是执行一遍格则中的命令列表。
命令列表中的每条命令必须以TAB键开始,不能使用空格!!!
make只编译修改过的文件,当我们修改了input.c时再次使用make进行编译时,如下:
删除编译后产生的.o文件和可执行文件main,使用命令make clean:
make的执行过程:
1、make命令会在当前目录下查找以Makefile(makefile也可以)命名的文件。
2、当找到Makefile文件以后就会按照Makefile中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存在,或者目标文件所依赖的文件比目标文件新(也就是最后修改时间比目标文件晚)的话就会执行后面的命令来更新目标。
这就是make的执行过程,make工具就是在makefile中一层一层的查找依赖关系,一旦写好了Makefile文件,以后只需要一个make命令即可完成整个工程的编译,极大地提高了开发效率。
#Makefile变量的使用
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
注意:Makefile的注释符号为#,不能用C语言中的"//"或者"/**/"
在上面的示例中我们使用了"="对变量进行赋值,Makefile变量的赋值符还有其它两个":="和"?="
1、赋值符"="
使用"="在给变量赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值,比如如下代码:
最终输出:
"="赋值符就是变量的真实值取决于它所引用的变量的最后一次有效值。
2、赋值符":="
输出:
赋值符":="不会使用后面定义的变量,只能使用前面已经定义好的,这就是"="和":="的区别。
3、赋值符"?="
上述代码的意思就是,如果变量curname前面没有被赋值,那么此变量就是"zhangzhongsheng",如果前面已经赋值过,那么就使用前面赋的值。
输出:
因为curname前面没有被赋值过,所以赋值为zhangzhongsheng
4、追加赋值"+="
将+=后面的内容追加到变量后面去
Makefile模式规则
模式规则中,至少在规则的目标定定义中要包涵"%",否则就是一般规则,目标中的"%" 表示对文件名的匹配,"%"表示长度任意的非空字符串,比如"%.c"就是所有的以.c 结尾的 文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。 当"%"出现在目标中的时候,目标中"%"所代表的值决定了依赖中的"%"值,使用方 法如下:
自动化变量
所谓自动化变量就是这种变量会把模式中所 定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该 出现在规则的命令中,常用的自动化变量如下:
模式规则和自动化变量使用如下:
Makefile伪目标
使用伪目标主要是为了避免 Makefile 中定义的执行命令的目标和工作目录下的实际文件出 现名字冲突,有时候我们需要编写一个规则用来执行一些命令,但是这个规则不是用来创建文 件的,比如在前面的Makefile文件中有如下代码用来完成清理工程的功能:
当我们的目录下存在clean文件,我们可以使用伪目标来进行区分:
Shell脚本
shell仅支持整形,数值计算使用$((表达式))
read表示读入数据,-p后跟提示信息,在输入前进行信息提示。
test命令
test命令用来查看文件是否存在、权限等信息,可以进行数值、字符、文件三方面的测试。
&&命令和||命令
cmd1&&cmd2 当cmd1执行完毕并正确,那么cmd2开始执行,如果cmd1执行完毕错误,那么cmd2不执行。
cmd1||cmd2 当cmd1执行完毕并正确,那么cmd2不执行,反之cmd2执行。
中括号[ ]判断符
默认参数
0\~n 表示shell脚本的参数,包括shell脚本命令本身,shell脚本命名本身为$0
$#:#表示最后一个参数的标号。
$@:表示$1、$2、$3...
执行结果:
条件判断if elif else
if 判断语句; then
执行语句
elif 判断语句; then
执行语句
else
执行语句
fi
case语句
case $变量 in
"第一个变量内容")
程序段
;;
"第二个变量内容")
程序段
;;
esac
shell脚本函数
函数写法如下:
function fname(){
//函数代码段
}
执行结果如下:
函数传参:
执行结果:
shell循环
shell脚本也支持循环,比如while do done,表示当条件成立的时候就一直循环,直到条件不成立。
while [条件] //括号内的状态是判断式
do //循环开始
//循环代码段
done
执行结果:
还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,写法如下:
until [条件]
do
//循环代码段
done
for循环,使用for循环可以知道有循环次数,写法
for var con1 con2 con3......
do
//循环代码段
done
执行结果:
第二个for循环写法:
for((初始值;限制值;执行步长))
do
//循环代码段
done
执行结果: