嵌入式学习--LinuxDay04
shell脚本
1.1数组
1.1.1数组的赋值
1.1.2数组的调用
1.2函数
1.2.1函数的定义方式
1.2.2函数的调用
2.分文件编程
2.1源文件
2.2头文件
3.编译工具
3.1 gcc编译工具
3.2 gdb调试
4.make工具
4.1定义
4.2Makefile格式
4.3Makefile管理多个文件
4.4Makefile变量
4.4.1自定义变量
4.4.2预定义变量
4.4.3自动变量
shell脚本
1.1数组
1.1.1数组的赋值
1)array=(1 2 3 4 5)
- array=($1 $2 $3 $4 $5) 命令行传参
3) read a b c
array=($a $b $c)
4)read -a array 从终端输入数据到数组中
1.1.2数组的调用
array[i] 获取下标为i的变量,i的范围:0~n-1
${array[i]} 通过下标获取元素的值
array[i]=200 对数组元素重新赋值
${array[@]} 数组的所有元素
${#array[@]} 数组所有元素的个数
遍历数组:
- echo ${array[@]}
- for ((i=0;i<${#array[@]};i++))
do
echo -n ${array[i]}
done
练习:用shell脚本实现冒泡排序
1.2函数
1.2.1函数的定义方式
1)function_name ()
{
命令表
}
2)
function function_name ()
{
命令表
}
1.2.2函数的调用
函数名 参数列表
#!/bin/bash
fun()
{
echo "hello"
}
function fun1()
{
NUM=`expr $1 + $2`
echo $NUM
}
fun
fun1 1 2
函数内$1 $2表示的是传递的参数
2.分文件编程
2.1源文件
main.c //存放main函数的
fun.c //存放其他功能函数的
2.2头文件
包含:头文件、宏定义、函数声明、结构体、共用体、枚举、typedef
例如:
编译:gcc main.c fun.c
执行:./a.out
#include引用时“ ”与<>的区别:
< > :去系统默认搜索路径下查找头文件
" " :先在当前目录查找,找不到再去系统默认搜索路径下查找头文件
系统默认搜索路径?
/usr/include
/usr/local/include
追源码:ctrl 单击
退回:ctrl alt -
3.编译工具
3.1 gcc编译工具
预处理:#开头内容,展开头文件、替换宏定义、删除无用注释,不会检查语法错误
gcc -E xx.c -o xx.i
编译:检查语法错误,有错就报错,无错就继续生成汇编文件
gcc -S xx.i -o xx.s
汇编: 将汇编文件生成不可执行的二进制文件
gcc -c xx.s -o xx.o
链接: 链接库文件,生成可执行的二进制文件
gcc xx.o -o xx
gcc xx.c -o xx -->直接生成可执行文件
gcc xx.c --->a.out
3.2 gdb调试
gcc -g xx.c
gdb a.out
r: 运行代码
l: 查看文件
b 行号或者函数名:添加断点
info b:查看断点情况
d num(断点编号):删除断点
p 变量名:查看变量的值
s/n: 单步运行,s会进入子函数顺序执行;单步跳过,n不会进入子函数
c: 执行到下一个断点的位置
help:帮助
q: 退出
步骤:代码写好后,先通过gcc -g进行编译代码,没有错误后,可以通过gdb a.out进行调试,输入l查看文件内容,通过b设置断点,输入r进行运行,n或s进行单步调试,q退出
4.make工具
4.1定义
make:工程管理器
make工程管理器就是一个“自动编译管理器”这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
Makefile 和makefile 是读取的唯一配置文件
gcc hello.c fun.c ---->a.out
gcc -c hello.c -o hello.o
gcc -c fun.c -o fun.o
gcc xx.o -o xx
4.2Makefile格式
目标:依赖
命令
注意:命令前必须有TAB
gcc编译步骤中,可以按照如下步骤的逆序写Makefile文件
gcc -c xx.c -o xx.o 目标:xx.o 依赖:xx.c
gcc xx.o -o xx 目标:xx 依赖:xx.o
例如:写一个test.c文件,再写一个Makeflie文件编译
使用make进行编译,生成相应的可执行文件
4.3Makefile管理多个文件
首先创建多个文件
如:
写一个Makefile文件
4.4Makefile变量
4.4.1自定义变量
自定义变量一般大写,取变量的值$(变量名)
= 递归赋值,按照递归方式展开
:= 直接赋值(当前为多少就固定是多少)
+= 追加赋值
?= 判断之前是否定义,如果定义了就不再赋值,否则重新赋值
4.4.2预定义变量
系统预先定义好的一些变量,可能有默认值可能没有默认
RM 文件删除程序的名称,默认值为rm -f
CC C编译器的名称,默认值为cc。
CPP C预编译器的名称,默认值为$(CC) –E。
CFLAGS C编译器的选项,无默认值。
OBJS 生成的二进制文件或目标文件,自己定义
4.4.3自动变量
$< 第一个依赖的名称
$@ 目标文件的完整名称
$^ 所有依赖的名称
最终: