linux指令基础学习 —— vim、gcc、makefile、shell


在C语言中,对于引用头文件的#include ,使用C自带的头文件时用<>符号,如果是自己写的头文件,则用两个双引号""

Vim指令

配置vim:

sudo vim /etc/vim/vimrc

在打开的文件中修后面添加:

tab键设为4个空格:set ts=4
显示行号:set nu

使用vim打开文件时,在没有输入模式情况下:

dd: 删除游标所在的一整行(常用)
ndd: n为数字。删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行
d1G: 删除光标所在到第一行的所有数据
dG: 删除光标所在到最后一行的所有数据
d$: 删除光标所在处,到该行的最后一个字符
d0: 那个是数字0,删除光标所在到该行的最前面的一个字符
x,X: x 向后删除一个字符(相当于[del]按键),X向前删除一个字符(相当于[backspace]即退格键)
nx: n为数字,连续向后删除n个字符


gcc编译

gcc编译过程:预处理,汇编,编译,链接

gcc mian.c //默认生成链接,生成a.out
gcc main.c -o main //将a.ou更名为main
gcc main.c -v //显示编译过程
gcc main.c -c //编译成o文件

gcc后面可以跟多个c文件,顺序随意
缺点:gcc每一次都会对所有的源文件进行编译,不管有没有被修改


make和Makefile

详细的makefile学习文件:
《跟我一起写Makefile》 链接:https://pan.baidu.com/s/1Wvkz-vIFXzCHBq7OLS8p-w 提取码:bx2p

make是一个编译管理工具makefile是一个文件,用来描述整个工程的编译、连接规则;使用make编译时,会在当前目录查找makefile文件,同时只会编译有修改过的文件,但是对于被修改的h文件,会重新编译包含该h文件的所有文件

在工程目录新建一个Makefile文件(注意大小写,无后缀)
在Makefile文件编辑规则:

目标:依赖文件集合
	命令1
	命令2
	……
object_o = main.o input.o calcu.o

main:$(object_o) //终极目标时生成main可执行文件,放在第一行
	gcc $(object_o) -o main //将所有的o文件链接

%.o: %.c
	gcc -c $<
//上面等效于,详情在下文:
/*
main.o : main.c
	gcc -c main.c // 将c文件编译成o文件
input.o : input.c
	gcc -c input.c 
calcu.o : calcu.c
	gcc -c calcu.c 
*/

clean:
	rm *.o
	rm main

Makefile中可以使用变量:字符串
引用变量方法:$(变量名),注意有括号
对于几种赋值符号:

【=】:现在的值取决于未来
【:=】:现在的值只与现在的值有关
(上面两者有点像verilog里的阻塞和非阻塞)
【?=】:现在的值与过去的相关
【+=】:与普通变量的+=一样

test1 = lyf
test2 = $(test1)
test1 = fyl
//此时test2的值为fyl

test1 = lyf
test3 := $(test1)
test1 = fyl
//此时test3的值为lyf

test1 = lyf
test4 = yfl
test4 ?= $(test1)
//此时test4的值为yfl

object = mian.o input.o
object += calcu
//此时object = mian.o input.o calcu

【%】:表示对文件名的匹配,表示任意长度的非空字符串,类似于通配符 *
自动化变量:

【&@】:表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@“就是匹配于目标中模式定义的集合
【&<】:依赖目标中的第一个目标名字。如果依赖目标是以模式(即” % “)定义的,那么” $<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。与上面的%结合使用,相当于if
【&^】:所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份

main.o : main.c
	gcc -c main.c
input.o : input.c
	gcc -c input.c
calcu.o : calcu.c
	gcc -c calcu.c

以上三条规则等效于下面:

%.o: %.c
	gcc -c $<

伪目标格式:

.PHONY:规则名
规则名:
	命令1
	命令2

Makefile条件判断:
关键字:ifeq、ifneq、ifdef、ifndef
语法格式有两种:

//第一种
<条件关键字>
	<条件为真时执行的语句>
endif

//第二种
<条件关键字>
	<条件为真时执行的语句>
else
	<条件为假时执行的语句>
endif

ifeq判断连个参数是否相等,ifneq则相反
ifeq(<参数1>,<参数2>) //ifneq一样,可以不是用括号,参数分别用单引号或者双引号括起来即可

ifdef判断变量的值是否为空,ifndef则相反
ifdef <变量名> //ifndef一样的用法

Makefile函数,都是已经定义好的函数供调用,不支持自定义的函数,下面的参数集合中,多个参数以逗号隔开
$(函数名 参数集合) 或 ${函数名 参数集合}

《跟我一起写Makefile》 链接:https://pan.baidu.com/s/1Wvkz-vIFXzCHBq7OLS8p-w 提取码:bx2p


shell脚本

后缀名为.sh的文件,存放了多条指令,从上而下执行

//第一行一定是:
!#/bin/bash

然后需要赋予权限:chmod 777 xxx.sh

交互式://echo里的变量没有括号,区别于上文makefile里的
输出:echo

echo "your age : $age , your name : $name"

输入:read
read可以显示提示信息并同时获取多个值

read -p "提示信息" 变量1 变量2

仅支持整形变量的运算:

value=$(( $int1 + $int2 )) //两个整形变量相加

(注意上面的value和$之间不能有空格)

test查看文件是否存在、权限、字符串是否相等等信息

cmd1 && cmd2 //当cmd1执行正确,才执行cmd2
cmd1 || cmd2 //当cmd1执行不正确时,才执行cmd2

【[ ]】:可以判断两个字符串是否相等,里面的符号只能是 == 或 !=

[ "$str1" == "$str2" ]

默认变量,shell命令可以输入参数
如:./my.sh a b //参数1是a,参数2是b

$0~$n,表示shell脚本的参数,包括shell脚本命令本身,shlle 脚本命令本身为$0
$#: #表示最后一个参数的标号。。
$@:表示$1、$2、$3 ...

shell的条件判断:
if语句

 if 条件判断语句 ; then
 	//要执行的命令
 elif 条件判断语句 ; then
 	//要执行的命令
 else
 	//要执行的额命令
 fi

case语句:

case $变量in
"第1个变量内容")
	程序段
	;; //表示该程序块结束! !
"第2个变量内容")
	程序段;;
“第n个变量内容")
	程序段
esac

脚本函数,可以自定义,下面的function可有可无

function fname(){
	//函数代码段
}

调用函数时只需要函数名即可,如果需要传参:
fname a b //表示传入两个参数
在函数获取参数的方法:

param1:$1
param2:$2

函数里的 $s1 和默认变量里的不是同一个东西

循环:

//第一种
while [条件] //括号 内的状态是判断式.
do //循环开始.
	//循环代码段.
done

//第二种
until [条件] //条件不成立时则执行
do
	//循环代码段
done

//第三种
for var in con1 con2 con3 ...
do
	//循环代码段
done

//第四种
for((i=0;i<10;i=i+!))
do
	//循环代码段
done




发布了17 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fengge2018/article/details/105036720