华清远见嵌入式培训_第四周回顾与反思

本周的课程重点介绍了Linux命令行工具,包括dpkg和apt-get的软件安装、tar的归档操作、cat、head、tail等文件处理命令,以及find、file、grep等实用工具。此外,深入讲解了shell编程,涵盖了变量、数组、算术运算、分支结构、循环结构和函数。最后,简述了Makefile的基础概念和作用,为自动化编译打下基础。通过反思,认识到从C语言到shell编程的转变需要理解和适应其语法差异。
摘要由CSDN通过智能技术生成

目录

前言

周二

Linux命令拓展

1 软件安装相关的命令

1.1 离线安装命令--dpkg

1.2 在线安装命令--apt-get

2. 归档和拆包的命令(tar)(重点)

3. 文件操作相关的命令

3.1 cat(重点)-----> 回显文件内容到终端

3.2 head ----> 从文件头开始回显

3.3 tail ----> 从文件的末尾开始回显

3.4 重定向符(重点) ---->  ‘ > 和 >> ’

3.5 find(重点) ----> 查到文件的命令

3.6 file(重点) ---> 查看文件属性的信息

3.7 grep(重点) ----> 从文件中搜索字符串

3.8 | (重点) -----> 管道符(用来连接多个命令)

3.9 echo ----> 打印的命令

3.10 read ----> 读数据到变量中

3.11 cut ---> 字符串剪切的命令

4.通配符的使用

5.文件属性操作相关的命令

5.1 修改文件权限的命令 --- chmod

5.2 修改用户所属的组 ---> chgrp

5.3 修改用户所属的用户和组 ----> chown

6、链接文件的创建

6.1 创建软链接文件

6.2 创建硬链接文件

7、开关机和重启的命令

周三

shell编程(上)

1. 一些小知识

1.1编程语言的分类

1.2 shell语言使用的解析器

1.3 什么是shell

1.4 shell脚本文件

2. 程序执行

3. shell中的变量

3.1 变量的定义

 3.2 变量的引用

 3.3 shell中的位置变量

3.4 定义变量使用的关键字

4. shell中的数组

4.1 数组的定义

4.2 数组的访问

4.3 数组的拼接

 周四

shell编程(中)

1. 输入输出命令

1.1 输入命令 ---> read

1.2 输出的命令 ---> echo

2. shell中的算术运算

2.1 shell中算数运算的介绍

2.2 使用 (()) 完成算数运算

2.3 使用 $[] 完成算数运算

2.4 使用 expr 命令完成算数运算

3. if...else分支语句

3.1 if...else分支语句的语法格式

3.2 if...else测试代码

4. test命令学习

4.1 test命令的介绍

4.2 字符串对象比较

4.3 整数对象比较

4.4 ⽂件类型判断

4.5 ⽂件权限判断

4.6 ⽂件⽐较

4.7 逻辑运算

5. case...in分支语句

5.1 case...in分支语句的格式

5.2 case...in的参考案例

6. while循环语句

6.1 while循环语句的语法格式

6.2 while循环的参考代码

周五

shell编程(下)及makefile编程

1、for循环

1.1 for循环的语法格式

1.2 参考案例

2、select ... in语句

2.1 select in的语法格式

2.2 select...in的测试代码

3、break和continue关键字

3.1 break使用

3.2 continue

3.3 测试代码

4、shell中的函数

4.1 shell中函数的定义

4.2 函数的调用

4.3 在函数体内获取函数的实参值

4.4 函数的返回值

4.5 参考案例

5. Makefile

5.1 Makefile概括

5.2 Makefile的基本语法构成

5.3 规则构成

5.4 Makefile中的变量

5.5 Makefile中的函数

反思与总结


前言

        不知不觉已经是在这学习的第四个周末了,这周因为中秋假期的原因,周一没上课,这四天的课主要讲了Linux命令的拓展、shell编程和Makefile编程:其中linux命令主要是讲了网络配置、软件安装,围绕linux的文件讲了一些常用的指令;对于shell编程,和C语言类似,讲了变量、数组、算数运算、分支结构、循环结构和函数;对于最后的Makefile编程,讲了规则构成、变量的使用、Makefile内置的函数和简单的Makefile文件的编写。

        这周有点浑浑噩噩,一方面假期结束没调整好状态,另一方面从C语言转到其他方面的学习,有很多需要理解的地方,尤其是刚开始没太跟上老师的思路和节奏,所以这次回顾总结会全盘把老师讲的东西过一遍。

        同样,写此文章,是想以这种碎碎念的方式回顾重点、重复盲点、加深印象,复习、总结和反思本周的学习,仅供后期自己回顾使用。知识体系不完善,内容也不详细,仅供笔者复习使用。如果是有需要笔记,或者对这方面感兴趣,可以私信我,发你完整的知识体系和详细内容的笔记。如有任何错误请多指正,也欢迎友好交流,定会虚心听取大佬的宝贵意见

周二

Linux命令拓展

1 软件安装相关的命令

1.1 离线安装命令--dpkg

1. linux安装软件包的后缀
	ubuntu  ----> .deb
	redhat  ----> .rpm

2. 离线软件包命名的方式
	sl_           3.03-17build2   _amd64   .deb
	|                   |            |       |
	软件的名称        版本号         架构    软件包的后缀
	
	amd64 ----> x64架构的软件包,64位系统
	i386  ----> x86架构的软件包,32位系统

3. 安装软件的命令(重点)
	sudo dpkg -i  软件安装包的名字

4. 卸载软件的命令(重点)
	sudo dpkg -r  软件的名字

5. 查看软件安装的列表信息
	sudo dpkg -l  软件的名字

6. 查看软件的安装路径
	sudo dpkg -L  软件的名字

7. 完全卸载软件 
	sudo dpkg -P  软件的名字

1.2 在线安装命令--apt-get

        在线安装软件需要配置ubuntu系统的源,在线安装软件时从哪个服务器中下载安装软件。

因此需要给ubuntu系统指定源,国内常用的软件源有:清华源, 阿里源,163源。   

清华源的网址:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
1、在线安装	
    sudo apt-get install  软件名
	
	eg:
	sudo apt-get install oneko //安装追⿏标的⼩猫
    sudo apt-get install frozen-bubble //安装泡泡⻰
    sudo apt-get install cmatrix //代码⾬
    sudo apt-get install bastet //俄罗斯⽅块
    
    运行软件,
    oneko  ----> 在前台运行
    oneko &  ----> 进程在后台运行

2、下载软件包

	sudo apt-get download 软件名
	
	eg:
	sudo apt-get download oneko

3、卸载软件

	sudo apt-get remove 软件名
	sudo apt-get autoremove  软件名  ----> 卸载的更加干净
	eg:
	sudo apt-get remove oneko

4、下载软件的源码

	sudo apt-get source 软件名
	
	eg:
	linux@ubuntu:~$ sudo apt-get source oneko
	出现以下错误:
    Reading package lists... Done
    E: You must put some 'deb-src' URIs in your sources.list
	
	解决办法:修改/etc/apt/sources.list文件将deb-src的网址取消注释,其他全部注释。
	需要重新执行sudo apt-get update更新源,再次执行下载的命令。
	
	注:测试完成之后,将/etc/apt/sources.list修改为默认的状态。再将deb-src的网址注释掉

2. 归档和拆包的命令(tar)(重点

1. 参数
	-c : 归档
	-x : 拆包
	-f : 指定归档和拆包的文件的名字,必须放到所有参数的最后边
	-v : 显示归档和拆包的过程的详细信息
	
	-j : 使用bzip2的压缩格式进行压缩
	-J : 使用xz的压缩格式进行压缩
	-z : 使用gzip的压缩格式进行压缩

2. 归档的命令-->单纯的进行归档并没有压缩
	tar -cvf 归档之后的文件名.tar   要归档的文件名/文件夹

3. 拆包的命令
	tar -xvf 要拆包的文件名.tar

4. 归档的同时进行压缩

	tar -jvcf  归档之后的文件名.tar.bz2  要归档的文件名/文件夹
	tar -jxvf 要拆包的文件名.tar.bz2 
	
	tar -Jvcf  归档之后的文件名.tar.xz  要归档的文件名/文件夹
	tar -Jxvf 要拆包的文件名.tar.xz
    
    tar -zvcf  归档之后的文件名.tar.gz  要归档的文件名/文件夹
	tar -zxvf 要拆包的文件名.tar.gz

5. 万能的拆包并解压缩的命令
	tar -vxf 要拆包的文件名.tar.xx
	
	xx 表示bz2,gz, xz

3. 文件操作相关的命令

3.1 cat(重点)-----> 回显文件内容到终端

用法:	
    cat  文件名  ----> 回显文件内容到终端
	cat  -n 文件名  ----> 回显文件内容到终端, 显示行号
	cat 文件名1  文件名2 > 文件名3  ---> 将文件名1和文件名2中的内容重定向到文件名3中
										(实现多个文件的拼接)
	
	> : 重定向
案例   
linux@ubuntu:day01$ cat hello.c 
#include <stdio.h>

linux@ubuntu:day01$ cat world.c 
int main(int argc, const char *argv[])
{
 
 return 0;
}

linux@ubuntu:day01$ cat hello.c world.c 
#include <stdio.h>

int main(int argc, const char *argv[])
{
 
 return 0;
}

linux@ubuntu:day01$ cat hello.c world.c > helloworld.c
linux@ubuntu:day01$ cat helloworld.c 
#include <stdio.h>

int main(int argc, const char *argv[])
{
 
 return 0;
}

3.2 head ----> 从文件头开始回显

用法:
	head 文件名  ----> 默认回显文件的前10行,如果不够就全部回显
	
	head -5 文件名   -----> 显示前五行

3.3 tail ----> 从文件的末尾开始回显

用法:
	tail 文件名  ----> 默认回显文件末尾的后10行,如果不够就全部回显
	
	tail -5 文件名   -----> 显示文件末尾的后五行

3.4 重定向符(重点) ---->  ‘ > 和 >> ’

重定向:将命令的执行的结果重定向到其他文件中,不在终端回显。

shell命令 > 文件 : 将命令的结果重定向到“文件”中,如果文件不存在则创建文件,
			如果文件存在,并且文件中有内容,则先将内容清空在进行重定向。

shell命令 >> 文件 : 将命令的结果重定向到“文件”中,如果文件不存在则创建文件,
			如果文件存在,并且文件中有内容,从文件中的内容末尾开始追加内容。

3.5 find(重点) ----> 查到文件的命令

用法:
	find  路径  -name  要查找的文件名    ----> 从“路径”下查找“要查找的文件名”
	
	注:文件名中可以使用通配符 *(多个字符)  ?(单个字符)
eg:
	find . -name  hello.c   ---> 在当前目录查找hello.c
	find /etc  -name passwd  ----> 在/etc目录下查找passwd文件

3.6 file(重点) ---> 查看文件属性的信息

用法:
	file 文件名
eg:
linux@ubuntu:day02$ gcc hello.c -o hello
linux@ubuntu:day02$ file hello

hello: 
	ELF   ----> 可执行文件的格式
	64-bit LSB shared object,  ----> 64位可执行程序 小端对齐
	x86-64, ----> 可执行程序的架构
	version 1 (SYSV), 
	dynamically linked,  ----> 动态链接
	interpreter /lib64/ld-linux-x86-64.so.2,   ---> 动态库
	BuildID[sha1]=aecfe163e5e53998d09c4ec5becb342c6d672a73, 
	for GNU/Linux 3.2.0, 
	not stripped  ----> 没有压缩

3.7 grep(重点) ----> 从文件中搜索字符串

用法:
	grep  -参数   "要搜索的字符串"   文件名/目录
参数:
	-n ----> 显示搜索内容的行号
	-R ----> 递归搜索,如果是一个目录,必须添加-R参数
	-i ----> 查找时不区分大小写
	-w ----> 按照单词进行查找
eg:
	grep -n  "main"   ./helloworld.c   ---> 从helloworld.c文件中查找main字符串
	grep -nR "main"   ./          ---> 从当前目录下所有的文件中递归查找main字符串
	
	grep -n "linux" /etc/passwd ---> 从文件中查找"linux"字符串
	grep -n "^linux" /etc/passwd ---> 从文件中查找开头为"linux"字符串
	grep -n "bash$"  /etc/passwd ---> 从文件中查找结尾为"bash"字符串
	grep -n "^bash$"  /etc/passwd ---> 
					从文件中查找开头为"bash"字符串,结尾也为"bash"字符串
					 
	grep -ni  "MAIN"   ./helloworld.c  ---> 从helloworld.c文件中查找MAIN字符串,不区分大小写
	
	grep -nw  "hello"   ./helloworld.c  ---> 从helloworld.c文件中查找hello字符串,按照单词查找

3.8 | (重点) -----> 管道符(用来连接多个命令)

用法:
	shell命令1 | shell命令2 | shell命令3 | ......
功能:将前一个命令的结果作为后一个命令的输入
eg :
	查找当前目录下的hello.c文件:
	ls | grep "hello.c"  ----> 从当前目录下查找是否存在hello.c文件

练习题
	1> passwd文件中内容的解析(/etc/passwd)
		linux : x : 1000 : 1000:linux,,,:/home/linux:/bin/bash
		  |     |     |      |     |         |          | 
		用户名  密码  用户ID 组ID   描述信息   家目录     使用bash解析终端的命令
	2> 使用管道符的方式提取linux用户所在的行的信息
		grep "^linux" /etc/passwd  -n
		cat /etc/passwd | grep "^linux"
		cat -n /etc/passwd | grep "linux"
		head -46 /etc/passwd | tail -1

3.9 echo ----> 打印的命令

用法:
	echo "字符串"
	echo 字符串
	echo '字符串'  ----> 回显字符串到终端
	
	echo ${shell变量的名字}
	echo $shell变量的名字   ----> 回显变量的值到终端
linux@ubuntu:day01$ echo hello world
hello world
linux@ubuntu:day01$ echo "hello world"
hello world
linux@ubuntu:day01$ echo 'hello world'    ----> 输出字符串
hello world
linux@ubuntu:day01$ name=zhoukai    ----> 定义变量,等号两边不允许有空格,变量的值是一个字符串,
         可以加'', 可以加"", 可以什么都不加
linux@ubuntu:day01$ echo $name
zhoukai
linux@ubuntu:day01$ echo ${name}    ----> 输出变量的值
zhoukai

3.10 read ----> 读数据到变量中

用法:
	read shell变量名   ---> 将终端输入的输入读到变量中
	read -p "提示字符串"  变量名 ---> 先打印一个提示符,将提示符后边输入的内容读到变量中
	
eg: 
 linux@ubuntu:day01$ read name
    zhoukai2
    linux@ubuntu:day01$ echo $name
    zhoukai2
 
    linux@ubuntu:day01$ read -p "please input your name > " name
    please input your name > zhoukai3
    linux@ubuntu:day01$ echo $name
    zhoukai3

 linux@ubuntu:day01$ read -p "please input your name, age > " name age
    please input your name, age > zhoukai 18
    linux@ubuntu:day01$ echo $name
    zhoukai
    linux@ubuntu:day01$ echo $age
    18
    linux@ubuntu:day01$ echo $name $age
    zhoukai 18

3.11 cut ---> 字符串剪切的命令

用法:
	cut -d "分隔符" -f 截取的域  要截取的文件名及路径

案例:
	grep "^linux" /etc/passwd > ./passwd
	
	linux@ubuntu:day02$ cat passwd 
    linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
  域  1   2   3    4     5         6           7
    
    linux@ubuntu:day02$ cut -d ":" -f 6 ./passwd   ---> 截取第6部分
    /home/linux
    linux@ubuntu:day02$ cut -d ":" -f 1,6 ./passwd ---> 截取第1,6部分
    linux:/home/linux
    linux@ubuntu:day02$ cut -d ":" -f 3-4,6 ./passwd  ---> 截取第3to4,6部分
    1000:1000:/home/linux
    linux@ubuntu:day02$ cut -d ":" -f 3-6 ./passwd    ---> 截取第3to6部分
    1000:1000:linux,,,:/home/linux


案例题:将/etc/passwd文件中linux用户的对应家目录字符串截取出来(grep | cut)
	
	grep "^linux" -n /etc/passwd | cut -d ":" -f 7 
				|                          |     | ---> 第七部分
				|  						   |
				|                          |---> 冒号分隔
				|
				|
	46:linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
  域 1   2   3   4    5      6         7          8
 
 ----------------------------------------------------------------
  
	grep "^linux" /etc/passwd | cut -d ":" -f 6 
				|                       |     | ---> 第6部分
				|  					    |
				|                       |---> 冒号分隔
				|
				|
	linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
  域 1    2   3   4       5         6         7       
	
	----------------------------------------------------------- 
	
	head -46 /etc/passwd | tail -1 | cut -d ":" -f 6

案例题:将/etc/passwd文件中linux用户的用户ID和组ID字符串截取出来(grep | cut)
   grep "^linux" -n /etc/passwd | cut -d ":" -f 4-5 
   grep "^linux" /etc/passwd | cut -d ":" -f 3,4 

4.通配符的使用

touch  a1.c a2.c a3.c a4.c aa.c ab.c ac.c ad.c aaa.c abb.c acc.c add.c 


1. * ----> 匹配多个字符
	linux@ubuntu:day02$ ls a*.c
	a1.c  a2.c  a3.c  a4.c  aaa.c  aa.c  abb.c  ab.c  ac.c  acc.c  ad.c  add.c


2. ? ----> 匹配单个字符
    linux@ubuntu:day02$ ls a?.c
    a1.c  a2.c  a3.c  a4.c  aa.c  ab.c  ac.c  ad.c
    linux@ubuntu:day02$ ls a??.c
    aaa.c  abb.c  acc.c  add.c
    
3. []  ----> 匹配中括号中的某一个字符
	linux@ubuntu:day02$ ls a[abcd].c   ---> 第二个字符为abcd的任意一个
    aa.c  ab.c  ac.c  ad.c
    linux@ubuntu:day02$ ls a[a-d].c    ---> 第二个字符为a到d的之间的任意一个
    aa.c  ab.c  ac.c  ad.c
    linux@ubuntu:day02$ ls a[1-4].c    ---> 第二个字符为1到4的之间的任意一个
    a1.c  a2.c  a3.c  a4.c
    linux@ubuntu:day02$ ls a[^1-4].c   ---> 第二个字符除了为1到4之间的任意一个
    aa.c  ab.c  ac.c  ad.c
    linux@ubuntu:day02$ ls a[^abcd].c  ---> 第二个字符除了为a到b之间的任意一个
    a1.c  a2.c  a3.c  a4.c

5.文件属性操作相关的命令

5.1 修改文件权限的命令 --- chmod

-rwxrwxr-x 1 linux linux     16704        Sep 12 23:04       a.out
| |  |  |  |    |    |          |->文件大小     |--> 日期       |---> 文件名
| |  |  |  |    |    |----> 所属的组
| |  |  |  |    |----> 所属的用户
| |  |  |  |-----> 硬链接个数
| |  |  |----> 其他用户的权限
| |  |-----> 文件所属组的权限
| |-----> 文件所属用户的权限
|-------> 文件的类型

1. 文件类型
	bsp-lcd :
	块设备文件/套接字文件/管道文件/普通文件/链接文件/字符设备文件/目录

2. 文件的权限
	r ---> 可读(4)
	w ---> 可写(2)
	x ---> 可执行(1)

3. 所有的用户
	a ---> 所有的用户(all)
	u ---> 普通的用户(user)
	g ---> 组(group)
	o ---> 其他用户(other)

4. 权限操作
	+ ---> 添加权限
	- ---> 移除权限
	= ---> 修改权限
	
	augo + +-= + rwx : 从中各选取一个或多个任意组合

5. 修改文件的权限 ----> chmod
	方式1:
	chmod u+x  hello.c    ---> 给hello.c所属用户添加可执行的权限
	chmod g-w  hello.c    ---> 给hello.c所属组删除写的权限
	chmod o=rw hello.c    ---> 给hello.c所属其他用户修改为可读可写的权限
	chmod a+rwx hello.c   ---> 给hello.c所有的人都添加可读可写可执行的权限
	
	方式2:
	chmod 0777 hello.c   ---> 
	      ||||----> 设置其他用户的权限:可读+可写+可执行(4+2+1)
	      |||----> 设置所属组的权限:可读+可写+可执行(4+2+1)
	      ||----> 设置所属用户的权限:可读+可写+可执行(4+2+1)
	      |----> 表示8进制数,0可以省略
	
	具体设置文件为哪种权限,根据需要将:可读(4)+可写(2)+可执行(1),进行任意组合,
	让后将对应的权限的数据进行加法运算即可。

二进制到十六进制之间的转算(4位二进制对应1位16进制,记住8421)

0b * * * *

​    8 4 2 1

二进制到八进制之间的转算(3位二进制对应1位16进制,记住421)

5.2 修改用户所属的组 ---> chgrp

chgrp root hello.c  ----> 修改hello.c文件所属的组为root用户

5.3 修改用户所属的用户和组 ----> chown

chown root:root  hello.c   ---> 修改hello.c文件所属的用户和组
chown root:  hello.c   ---> 修改hello.c文件所属的用户和组
chown :root  hello.c   ---> 修改hello.c文件所属的组
chown root  hello.c    ---> 修改hello.c文件所属的用户

6、链接文件的创建

在查看文件的详细信息时有一个硬链接数:
-rw-rw-r-- 1 root root 101 Aug 10 18:17 hello.c

如果是一个文件,则硬链接数表示此文件的硬链接文件的个数;
如果是一个目录,则硬链接数表示此目录下的子目录的个数。

6.1 创建软链接文件

用法:
	ln -s 绝对路径/被链接的文件或者目录  绝对路径/链接的文件或目录的名字
	
总结:
	1> 创建软链接文件时既可以对普通文件创建软连接文件,也可以对目录创建软链接文件;	
	2> 在创建软连接文件时使用绝对路径,尽量不要使用相对路径;
		原因:如果使用相对路径时,当将软连接文件拷贝到其他目录下时,
			软连接文件和被链接的文件的链接关系将失效;如果使用绝对路径链接关系就不会失效。
	
	3> windows系统是不支持软链接文件,因此在后续的课程中,
		在解压缩***.tar.xx压缩文件时,要求在ubuntu中使用tar命令解压缩。
	4> 软链接文件的属性为----> l
	5> 创建软链接文件之后,硬链接数不会增加。
	6> 如果删除被链接的文件,则对应的软链接文件会失效,如果重新创建对应的文件,
		软链接文件会重新生效。
	
练习题:
	// 对目录创建软链接文件
	 ln -s /home/linux/DC22081/day01 /home/linux/DC22081/day01-s
	// 对文件创建软链接文件
	ln -s /home/linux/DC22081/day01/hello.c /home/linux
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值