嵌入式基础:Linux系统操作基础和Shell脚本编程基础内容梳理

本文介绍了Linux系统的基础知识,包括Deb和Rpm软件包管理,用户和用户组的管理,进程状态以及进程控制,文件系统的结构和文件权限,链接文件的类型,文件的压缩和归档方法,磁盘和网络管理,以及Shell命令的使用,如进程状态查看、文件操作、网络诊断。此外,还涉及到了shell脚本的基本概念,如变量、语句和函数。
摘要由CSDN通过智能技术生成

Linux系统基础

一、软件包管理机制

Debian Linux首先提出“软件包”的管理机制——Deb软件包

Redhat Linux基于这个理念推出了自己的软件包管理机制——Rpm软件包

命令:
1.离线安装:
	dpkg:不会检测软件的依赖
​	-i:安装
​    -r:移除

2.在线安装:
    apt工具
​	镜像源网址:/etc/apt/source.list
​	获取软件流程:
​	1.apt-get update:更新软件索引表
​	2.apt-get install:下载并安装
​	3.apt-get remove:删除
安装包存放位置:/var/cache/apt/archives

二、用户管理

有关用户配置的文件的文件路径:


​	1.用户信息的文件路径:/etc/passwd
​	2.用户密码信息的文件路径:/etc/shadow
​	3. 用户组信息的文件路径:/etc/group

用户配置相关命令:

	adduser:添加新用户

	su:切换用户,默认切换到root,加用户名切换到指定用户

usermod :

    -aG 追加用户组:
 	使用:usermod -aG 用户组名 用户名
 	作用:将某个用户追加到指定用户组中
	

deluser:删除用户

	​deluser  --remove-home  用户名 :删除用户的同时删除用户主目录

delgroup:删除用户组

exit:

	1. 退出用户
	2. 结束终端

三、进程管理

ps:显示进程状态

​		-ef 
​		-aux

​进程状态:	
​		R:运行态
​		S:等待态
​		T:暂停态
​		Z:僵尸态
​		<:高优先级的
​		N:低优先级
​		+:运行在前台的
​		小写s:拥有子进程的
​		小写的L:拥有子线程的

top:监控当前进程的状态

​q:退出监控状态

kill:向指定进程发送信号

​	-9:结束进程
​	-19:暂停进程

四、文件管理

1.文件系统:

​	windows:NTFS
​	Linux:EXT4
​	Linux系统下磁盘文件的路径:/dev/sda

文件系统结构:

​	windows:磁盘分区
​	Linux:树状结构
​	bin:可执行的二进制文件
​	etc:配置文件
​	home:存放新建用户的用户主目录
​	dev:设备文件目录
​	boot:系统启动
​	root:超级用户目录
​	mnt:挂载
​	usr:用户目录
​	include:头文件存放目录
​	ib:库文件存放目录

文件系统导航命令:(有关详细内容,请查看上一篇文章,在此不多赘述)
cd,pwd,ls
文件资源管理命令:(有关详细内容,请查看上一篇文章,在此不多赘述)
cp,touch,mv,rm,mkdir,rmdir
mkfifo:创建管道文件

2、文件权限管理

1.chmod:改变文件的操作权限

​	u:文件所有者
​	g:同组用户
​	o:其他用户
​	a:所有用户
​	r:读权限
​	w:写权限
​	x:可执行权限

​ 在使用chmod的时候也可以以三位八进制数的形式写明文件权限

   sudo  chmod  用户(可叠加)+-权限   要修改的文件
   sudo  chmod 0664 d.c                sudo chmod ug+w d.c

2.chown:改变文件的所有者

​		chown + 用户名 + 文件路径         eg:sudo  chown  root  d.c

3.chgrp:改变文件的所属用户组

​		chgrp + 用户组名 + 文件路径		eg:sudo  chgrp  root  230101

​4.ls -li :查询inode号

五、链接文件

命令:ln

1.软链接:

​	创建软链接:	ln -s  目标文件的路径  软链接文件名
		   eg:  ln -s   demo_2.c   my_link.c

​ 特点:类似于windows中的快捷方式

	1.inode号与源文件不同,是一个独立的文件
	2.在创建软链接时应该写明源文件的绝对路径,不然容易导致链接文件失效
	3.源文件路径修改则链接文件失效
	4.源文件删除则链接文件失效
	5.文件类型是链接文件

2.硬链接

​ 创建硬链接

​	ln 目标文件的路径 硬链接文件名

​ 特点:类似与文件的备份

1.inode号和源文件使用同一个
2.文件类型普通文件
3.硬链接不会随路径修改而发生失效
4.源文件删除链接文件任然有效,相当于顶替了源文件

六、压缩归档

1.文件的压缩(目标对象为文件)

使用方法:压缩/解压缩指令 + 文件名

gzip:对应的解压指令gunzip
​	gzip + 目标文件
	压缩好的文件后缀名为.gz

bzip2:对应的解压指令为bunzip2
​	压缩好的文件后缀名为.bz2

xz:对应的解压指令为unxz
​	压缩好的文件后缀名为.xz

zip:对应的解压指令为unzip
	压缩好的文件后缀名为.zip
	
压缩效率:xz>bzip2>gzip

特点:
1.压缩之后一定可以减小文件大小
2.压缩之后源文件不存在

2.文件的归档/打包(目标对象为目录)

使用方法:tar + -参数选项 + 文件名

​参数选项:
​	-c:创建归档文件
​	-x:释放归档文件
​	-v:关注创建或者释放归档文件的过程
​	-f:指定操作文件(必须添加)
​	-j:归档并压缩,压缩的文件后缀为.tar.bz2
​	-z:归档并压缩,压缩的文件后缀为.tar.gz
​	-J:归档并压缩,压缩的文件后缀为.tar.xz
	创建出的归档文件,文件后缀为.tar

创建归档过程:

tar + -cvf + 归档文件名 + 需要归档的目录文件

释放过程:

​万能公式:tar -xvf + 需要释放的归档文件名

特点:
1.打包之后并不会减小文件大小
2.归档文件不会删除源文件

六、磁盘管理

df,du

七、网络管理

ping:检测两主机间的网络是否能正常通信
ifconfig:查看网络配置
sudo service network-manager restart:重启网络管理工具

##shell:

本质:命令解释器

系统管理命令:
			shutdown:关机
			reboot:重启

shell命令格式:

​ 命令 选项 参数

shell特殊字符:

1.通配符:

*:匹配任意长度字符串
?:匹配一个字符
[...]:匹配方括号内任意的一个字符
[1-9]:匹配方括号内范围的一个字符
[^..]:匹配除了方括号内的任意的一个字符

2.管道

管道:|
作用:将前一条指令的输出作为下一条指令的输入

3.输入输出重定向

>:改变输出方向(截断,原文件的内容将会被清空)
>>:改变输出方向(追加)
<:改变输入方向
2>或&>:重定向错误输出方向

4.命令置换符

符号:``(键盘上esc键下面那个,不是单引号)  echo
功能:将一个命令作为调用命令的参数

常用指令:


​	grep:查询某个文件中的特定字符串 -n:查询行号

​	wc:统计指令

​	find:查询文件 find -name 文件名 查询路径

shell脚本

本质:shell命令的有序集合,shell脚本是一种解释型语言,每一行代码都相当于一条指令。

开始一个shell脚本的编程:

1.创建一个以.sh为文件后缀的文件
2.shell脚本文件内容编写
​	建议在shell脚本的第一行说明解释器路径
​	#!/bin/bash
3.修改文件的执行权限
4.执行shell脚本

第二种执行shell脚本的方式:不用修改权限利用解释器直接运行shell脚本,bash + shell脚本文件

一、shell中的变量

1. 用户自定义变量

由用户自己定义出的变量
1.变量的命名
	由字母,数字,下划线组成,不能以数字开头
2.变量的数据类型:
	在shell脚本中没有具体的数据类型,所有数据都被理解为字符串
3.变量的赋值:
	变量名=数据
	
	注意:1.等号两边不能空格
		 2.可以直接写数据也可也用单引号或者双引号包覆
		 赋值完成不用以分号作为结束
		 
		 3.单引号和双引号使用的异同:
		 相同点:
		 	在变量赋值时都可以在字符串中存在空格
		 不同点:
		 	双引号内可以引用其他变量,而单引号不行
		 	
4.变量的引用
	1.$变量名
    2.${变量名}
5.变量的删除
	unset 变量名
	unset 取消变量的赋值
在shell脚本中变量定义出来都以全局变量理解

2. 位置变量

同命令行参数效果,即一开始给程序运行传递的参数
$0:脚本文件名,运行脚本的执行命令
$1:命令行参数的第一个参数
$2:命令行参数的第二个参数
$3.....$n:。。。

3. 预定义变量

$$:获取当前进程的pid号
$?:获取上一条命令退出的状态值(0为真,1为假)
$*:命令行参数所有内容,除了$0
$@:效果同$*
$#:命令行参数的个数,但是除去$0

4. 环境变量

env–查看所有的环境变量

HOME:用户主目录路径
TERM:终端类型
PATH:shell的搜索路径

二、shell脚本中的语句

1、说明性语句

在代码中起到解释的作用,同注释效果
1.#:注释#号后的一行内容

2.注释一块代码,即注释多行
	1.
	 :<<EOF
	 EOF
	2.
     :<<?
     ?

2、功能性语句

(1). 输入功能语句:read
```
作用:从键盘获取数据
-p:在输入的时候可以存在提示样式
read -p “提示语句” 变量

  -s:静默输入,即在输入的时候不显示输入的内容
  	read -s 变量
  	
  -n:在输入时限定输入位数,位数一旦达到则立即停止输入
  	read -n 限定位数值 变量
  	
  -t:在输入的时候限定输入的时间,超过时间则立即停止输入
  	read -t 限定的秒数 变量
  ```

  read -p 举例:

  ```c
   1 #!/bin/bash
   2 read -p "please input a number:" arr
   3 echo "arr=$arr"
   4 echo $?
  
  ```
  ```c
   1 #!/bin/bash
   2 read -p "please input a number:" arr b c d
   3 echo "arr=$arr"
   4 echo $b
   5 echo $c
   6 echo $d
  前面依次赋值,剩下的所有都赋值给最后一个变量
  ```

(2). 测试功能语句:test

测试对象:字符串、数值、文件
	1.字符串:
		=:判断俩个字符串是否相同
		!=:判断不相同
		\>:判定两个字符串谁大
		\<:判断谁小
			例如:
				test $val1 = $val2
		-z:判断一个字符串长度是否为0
		-n:判断一个字符串长度是否不为0
			例如:
				test -z $val
	2.数值:
		-eq:判断两个数值是否相同
		-ne:判断两个数值是否不同
		-lt:判断小于
		-gt:判断大于
		-ge:判断大于等于
		-le:判断小于等于
			例如:
				test $val1 -eq $val2
	3.文件:
		-e:判定文件是否存在
		-r:判定文件是否拥有读权限
		-w:判定文件是否拥有写权限
		-x:判定文件是否拥有执行权限
		-d:判定文件是否是目录文件
		-p:判定文件是否是管道文件
		-L:判定文件是否是链接文件
		-f:判定文件是否是普通文件
			例如:
				test -e $file_path
		以时间戳来判定文件的新旧
		-nt:判定第一个文件是否比第二个文件更新
		-ot:判定第一个文件是否比第二个文件更旧
			例如:
				test $file1 -nt $file2

(3). expr算数功能语句

运算符:
	和C语言中运算符类似
1.((表达式)):算数运算,只能操作整数
	注意:可以写较为复杂的运算表达式
		 在表达式中可以加$引用变量也可也不加
		 最终运算的结果可以通过$赋值给其他变量
2.$[表达式]:算数运算,只能操作整数
	和(())类似,运算完的结果一定需要赋值给其他变量
3.expr:算数运算,字符串的运算
	expr是一条指令,在使用expr的时候需要用到命令置换符来获取命令最终运算的数据
	算数运算:+,-,\*,/,|,&
		注意:由于*为通配符,所以需要加一个反斜杠转义成乘号
	字符串运算:
		length:计算字符串的长度
			例如:
				len=`expr length $string`
				作用计算string的长度存储到len变量中
		index:定位子字符在字符串中的位置
			例如:
				val=`expr index $string "e"`
				作用匹配源字符串中e字符存在的位置
		substr:裁剪源字符串中内容
			例如:
				val=`expr substr $string 2 3`
				作用从源字符串的第二个字符开始裁剪,裁剪3个字符
	expr使用时注意事项:
		运算符间需要空格
		使用脚本中的变量需要引用

练习:
1. 从命令行参数传递一个文件的路径,判定该文件的类型
2. 从命令行输入两个数字,完成对这个两个数字的运算
3. 从命令行输入一个字符串,裁剪其中的匹配到e字符开始后的5个字符

3、结构性语句

(1).选择语句

1.if语句

if 表达式(测试语句)
then
	命令
fi
表达样式:
	1.例如
		if test -e $file
		then
			echo "file is exit"
		fi
	2.例如
    	if [ -d $file ]
    	then
    		echo "file is a dirctory"
    	fi
		注意:方括号两端都必须存在一个空格
多路分支表达样式
	1.两路分支
		if 测试语句
		then
			命令
		else
			命令
		fi
	2.多路分支
		if 测试语句
		then
			命令
		elif 测试语句
		then
			命令
		else
			命令
		fi
嵌套使用
	嵌套使用的时候有几个if最后就会有几个fi

练习:
判定输入的文件是否存在,存在则判断文件的类型,不存在则说明不存在

练习:输入一个文件,判断这个文件是否存在,如果没有可写权限,增加可写权限,然后把“hello world”放到这个文件里面来,如果有直接放“hello world”

1 #!/bin/bash
  2 read -p "please input a filename:" file
  3 if test -e $file
  4 then
  5     if test -w $file
  6     then
  7         echo "hello world" >>$file
  8     else
  9         chmod +w $file
 10         echo "hello world" >>$file
 11     fi
 12 else
 13     echo "file is not exist"
 14     touch $file
 15     echo "hello world">>$file
 16 fi

2.case语句

表达形式:
	case 变量 in
		模式1)
			命令
			;;
		模式2)
			命令
			;;
		*)#类似于C语言中default的用法
			命令
			;;
	esac
使用注意:
	模式实际上是一个字符串
	匹配多个字符串实现同一个效果‘|’
		例如:
			模式1|模式2|模式3)
	通配符在shell脚本中同样实用
		

选择语句例子:

 1 #!/bin/bash
  2 read a
  3 case $a in
  4     1)
  5         echo "monday"
  6         ;;
  7    2)   
  8        echo "tuesday"
  9        ;;
 10 esac            
(2). 循环语句
  1. for循环

    表达形式
    	for 变量名 in 单词表
    	do
    		命令
    	done
    使用注意:
    	可以使用seq命令获取一串数字
    		seq 起始值 单次跳转值 终止值
    		如果单次跳转没有指定按照1来进行加法
    
    
   #!/bin/bash
   
   function sum()
   {
   #   for i in {1..100}    //单词表的方式
       for((i=0;i<101;i++))    //条件在C的基础上加双括号
       do
        sum1=$(($sum1+$i))
       done
    echo $sum1
   }
   sum //函数的调用
   
  for的c语言的用法

​ for((i=0;i<100;i++))

​ do

​ done

  1 #!/bin/bash
  2 for((i=1;i<=100;i++))
  3 do
  4     sum=$(($sum+$i))
  5 done
  6 echo $sum

for 变量 in 命令置换

​ do

​ shell语句

​ done

  1 #!/bin/bash
  2     for i in `ls`
  3     do
  4         echo $i
  5     done

  1. while循环

    表达形式
    	while 表达式(测试语句)
    	do
    		命令
    	done
    

    while循环的死循环例子:

    while true

    do

    shell语句

    done

      1 #!/bin/bash
      2 while true
      3 do  
      4     echo "hello world"
      5 done
    
(3). 循环控制语句
  ```
  1.break:退出一层循环
  	break + n:退出n层
  2.continue:退出一次循环
  	continue + n:
  ```

三、shell脚本中的函数

因为shell脚本的本质是shell命令的有序集合,而shell函数相当于将多个shell命令组合到一起形成一个大的shell命令。

1. shell脚本中的函数定义方法

  1. 函数名()

    {
    ​ 函数体
    }

  2. function 函数名()
    {
    ​ 函数体
    }

注意:
1 .在shell脚本中函数定义的时候不用专门指定形式参数。
2.shell脚本中数据大部分都是全局变量,如果要在函数中定义局部变量请加local限定。

2. shell脚本中的函数的参数传递

由于函数在定义的时候不用写清楚形式参数的个数和数据类型,因此实际参数传递个数随意。

在函数中形式参数表达方式类似于位置变量:
$1指函数传递的实际参数的第一个数据
$2第二个参数
。。。
$*:所以的实际参数

3. shell脚本中的函数的调用

函数名
函数名 形参1 形参2 . …
只有当函数调用之后,里面的变量才会生效

4.shell脚本中的函数的返回值

  1. 在函数内用return进行数据的返回

    在调用函数时可以利用$?来获取函数返回值
    return在函数中只能返回0-255的数值

    func()
    {
    	val=$(($1+$2))
    	return $val
    }
    func 10 20
    $?  #利用$?获取返回值
    
  2. 如果想在函数内放回字符串,只能利用echo来进行输出

    函数调用需要用命令置换符调用,用于接收该函数输出的数据,输出的数据可以存储在一个变量中

    func()
    {
    	val=$(($1+$2))
    	echo $val
    }
    retval=`func 10 20`
    echo $retval
    

练习:

1.将统计文件数量的脚本封装成shell脚本的函数

2.完成一个脚本可以在任意路径下创建一个工程文件夹,判断该文件夹是否存在,如果存在并且是目录文件的情况下报错,否则创建该目录文件,并且在该目录文件下创建src,include,lib,obj目录文件和一个Makefile普通文件

四、shell数组

数组名=(12 34 “zbc”)

数组的调用:ARR[下标]

${ARR[*]}—打印数组的所有内容

${#ARR[*]}----打印数组的长度(字符串的个数)

练习:遍历这个数组

 1 #!/bin/bash
  2 ARR=(12 56 "hello" "world")//数组的初始化
  3 echo ${ARR[2]}//数组的调用
  4 echo "ARR=${ARR[*]}"//打印数组所有内容
  5 echo "len=${#ARR[*]}"//求数组的长度 
  6 for((i=0;i<${#ARR[*]};i++))//遍历数组
  7 do  
  8     echo ${ARR[$i]}
  9 done

练习:交换第一个和第二个的内容

0 temp=${ARR[0]}
 11 ARR[0]=${ARR[1]}
 12 ARR[1]=$temp
 13 echo ${ARR[*]}

makefile

makefile是一个文件,管理多个文件
make是一个工具,解析makefile这个文件

1.基础语法

体验版makefile:

 all:标签
       gcc *.c -I ./include -o add   编译的命令

真正的makefile:
目标文件:依赖文件
目标文件就是最终生成的文件,一般为执行文件,需要去找它所有的依赖文件,如果依赖文件也需要其他的依赖文件,继续啊去找该依赖文件需要的依赖文件,直到不需要或报错

1 app:add.o main.o
  2     gcc main.o add.o -o app
  3 add.o:add.c
  4     gcc -c add.c -o add.o
  5 main.o:main.c
  6     gcc -c main.c -o main.o
  7 clean:
  8     rm *.o app

gcc和make的区别:
两者都可以生成执行文件,gcc是在编译时,不管编译几次会把所有文件从头开始编译,make是根据文件的时间戳来进行编译,如果时间戳没有发生改变,不会编译该文件,大量节约了编译的时间

makefile的变量

变量的调用:${变量名}   $(变量名)

变量的赋值方式:

= ---------普遍赋值,赋值最新的变量值

var=123
    var2=$(var)
    var=456
    all:
       echo $(var2)---打印456

: = -----------立即赋值

var=123
    var2:=$(var)
    var=456
    all:
       echo $(var2)---打印123

?=------------询问赋值,如果该变量之前已经赋值,此次不能赋值,如果没有就赋值

var=123
    
    var?=456
    all:
       echo $(var2)---打印123

+=---------追加赋值,连接起来

1 var=how
  2 var+=are you
  3 all:
  4     @echo $(var)--打印how are you

make -f 指定的makefile文件名
在命令前面加@–隐藏,在终端上就不显示
make clean----删除生成的目标文件

2.特殊变量

$^---所有依赖文件
$@---目标文件
$< ---第一个依赖文件
%是表示所有的通配符
  1 CC=gcc
  2 choice=-o
  3 TARGET=app
  4 OBJS=main.o add.o
  5 
  6 $(TARGET):$(OBJS)
  7     $(CC) $^ -o $@
  8 add.o:add.c
  9     $(CC) -c $< -o $@
 10 main.o:main.c
 11     $(CC) -c $< -o $@
 12 clean:
 13     rm $(OBJS) $(TARGET)

 1 CC=gcc
  2 choice=-o
  3 TARGET=app
  4 OBJS=main.o add.o
  5 
  6 $(TARGET):$(OBJS)
  7     $(CC) $^ -o $@
  8 %.o:%.c
  9     $(CC) -c $^ -o $@
 10 clean:
 11     rm $(OBJS) $(TARGET)

要求:会写简单的makefile和看懂别人的makefile

练习:

封装一个删除一段英文空格的函数,用make去编译
how are you
howareyou

#include <stdio.h>
char *delate_space(char *s)
{
    int i=0;
    char *p=s;
    char *q=NULL;
    while(*p)
    {
        if(' ' == *p)//找空格的位置
        {
            q=p;
            while(*q)
            {
                *q=*(q+1);//从空格开始依次往前赋值
                q++;
            }
            
        }
        p++;
    }

    return s;//此时p和q都指向‘\0'
}
int main(int argc, char *argv[])
{
    char a[32]={0};
    gets(a);
    puts(delate_space(a));

    return 0;
} 

gdb调试

gcc -g 编译文件 -o 执行文件名
例如:gcc -g test.c -o test

l—查看调试的文件,默认十行
b(break)—设置断点
b +行号
r—运行程序,运行到断点
c—继续运行到下一个断点
p+变量----查看此时变量的值
q—退出调试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值