Linux 学习笔记 (一) —— 杂项

Linux学习笔记


version : v1.0 「2022.7.28」 最后补充


author: Y.Z.T.



简介: Linux学习笔记 , 写的比较乱 , 属于随记




⭐️ 目录





1️⃣

1.1 Ubuntu文件系统结构

/bin 存放二进制可执行文件,这些命令在单用户模式下也能够使用。可以被root和一般的账号使用。

/boot Ubuntu内核和启动文件,比如vmlinuz-xxx。gurb引导装载程序。

/dev 设备驱动文件

/etc 存放一些系统配置文件,比如用户账号和密码文件,各种服务的起始地址。

/home 系统默认的用户主文件夹,一般创建用户账户的时候,默认的用户主文件夹都会放到此目录下。

/lib 存放库文件

/media 此目录下放置可插拔设备,比如SD卡,或者U盘就是挂载到这个目录中。

/mnt 用户可使用的挂载点,如果要挂载一些额外的设备,那么就可以挂载到此处。

/opt 可选的文件和程序存放目录,给第三方软件放置的目录。

/root root用户目录,也就是系统管理员目录。

/sbin 和/bin类似,也是存放一些二进制可执行文件。sbin下面的一般是系统开机过程中所需要的命令。

/srv 服务相关目录。比如网络服务。

/sys 记录内核信息,虚拟文件系统。

/tmp 临时目录

/var 存放一些变化的文件,比如日志文件

/usr usr不是user的缩写,而是UNIX Software Resource的缩写,存放于系统用户有关的文件,会占用很大的存储空间!

/proc 虚拟文件系统,数据放置到内存中,存放系统运行信息



1.2 压缩与解压缩

1.2.1 gzip压缩工具
  • .gzip工具负责压缩和解压缩.gz格式的压缩包。
  • gzip xxx //压缩
  • gzip -d xxx.gz //解压缩
  • gzip对文件夹进行压缩
  • gzip -r xxx //对文件夹进行压缩
  • gzip -rd xxx.gz //对文件夹进行解压缩

gzip虽然可以对文件夹进行压缩,但是并不能提供打包的服务,只是对文件夹中的所有文件进行了单独的压缩。


1.2.2 bzip2压缩工具

gzip类似,只是bzip2工具负责压缩和解压缩.bz2格式的压缩包。

bzip2 -z xxx //压缩

bzip2 -d xxx.gz //解压缩



1.2.3 tar 打包工具

​ tar工具参数:

-f,使用归档文件或 ARCHIVE 设备

-c:创建新归档,创建压缩文件

-x:从图档中解出文件,解压缩

-j:使用bzip2压缩格式。

-z:使用gzip压缩格式

-v:打印出命令执行过程。

tar工具提供打包服务,就是将多个文件打包,比如

tar -vcf test.tar test //将test打包成test.tar

tar -vxf test.tar //解包


上面的tar命令只提供了打包和解包的功能,tar在提供打包和解包的同时使用gzip/bzip2进行压缩,实现类似windwos下winRAR软件的命令。

1. 对.tar.bz2进行压缩和解压缩

tar -vxjf xxx.tar.bz2 解压缩

tar -vcjf xxx.tar.bz2 xxx 压缩

2、对.tar.gz进行压缩和解压缩

tar -vxzf xxx.tar.gz //解压缩

tar -vczf xxx.tar.gz xxx //压缩


1.2.4 其他格式压缩与解压缩
1、.rar格式

​ 需要先安装rar:sudo apt-get install rar

rar x xxx.rar //解压缩

rar a xxx.rar xxx //压缩

2、.zip格式

zip格式压缩使用“zip“命令:

zip -rv xxx.zip xxx

zip格式解压缩使用“unzip”命令:

unzip -v xxx.zip


1.3 文件权限

文件的权限有三种:读®、写(w)和执行(x),除了用 r、w 和 x 表示以外,

我们也可以使用二进制数表示,三种权限就可以使用 3 位二进制数来表示,一种权限对应一个

二进制位,如果该位为 1 就表示具备此权限,如果该位为 0 就表示没不具备此权限

image-20230404152212833

image-20230404152223424


以这个为例:

image-20230404152738341

-rw-rw-r--    

分别表示文件所属用户文件所属用户组其他用户的权限



1.3.2权限修改命令chmod

命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使

用字母表示,命令格式如下:

chmod [参数]   [文件名/目录名]

主要参数如下:

-c 效果类似“

-v 参数,但仅回显更改的部分。

-f 不显示错误信息。

-R 递归处理,指定目录下的所有文件及其子文件目录一起处理。

-v 显示指令的执行过程

例:

file3.c文件权限修改为766

image-20230404153715678



2️⃣

2.1 gcc编译器

gcc 命令格式如下:

gcc [选项] [文件名字]

主要选项如下:

-c:只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。

-o:<输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC 默认编译出来的可执行文件名字为 a.out。

-g:添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编译的时候生成调试所需的符号信息。(生成debug模式的可执行文件)

-O:对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进

行优化,这样产生的可执行文件执行效率就高。

-O2:比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。



2.2 shell script

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

2.2.1 写法

shell脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell脚本扩展名为.sh

shell脚本第一行 一定 要为:

#!/bin/bash
#表示使用bash。

shell基本写法

下面是一个简单的"hello world" 的shell脚本 test.sh

#!/bin/bash
echo "Hello World !"

运行shell脚本:

因为.sh文件默认没有执行权限 , 所以要给其权限:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本


2.2.2 shell 变量
  • 定义变量时,变量名不加美元符号

    name="yzt"
    
  • 变量名和等号之间不能有空格 , 变量的命名需要遵循以下规则:

    • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    • 中间不能有空格,可以使用下划线 _
    • 不能使用标点符号。
    • 不能使用bash里的关键字(可用help命令查看保留关键字)。
  • 使用变量的时候 , 只要在变量前面加一个美元($)符号就行 ,

    echo $name
    #也可以在变量外面加上花括号
    echo ${name}
    

系统变量:

$nn 的值为0~n , 表示shell脚本的参数 , $0表示当前运行的脚本文件本身 , $1 表示第一个参数 , $2 表示第二个参数 . …
$#命令行的参数个数
$?shell运行的前一个命令的返回码
$*以"($1) ($2) …" 形式的所有参数组成的字符串
$@以 “($1)” “( $2 )” … 形式的所有参数组成的字符串
$$当前脚本程序的进程ID
$!shell运行的前一个命令的进程ID

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

name="yzt"
readonly myUrl

删除变量

使用unset 命令可以删除变量

unset name
  • 变量被删除后不能再次使用, unset 命令不能删除 只读变量

变量类型

shell中的变量存在三种类型

  • 局部变量 : 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 环境变量 : 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量
  • shell变量 : shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行


2.2.3 字符串

单引号字符串

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
str='string'

双引号字符串

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
name="yzt"
str="name :\"${name}\" "

输出结果为 name : "yzt"



拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

获取字符串长度

string="abcd"
echo ${#string}   # 输出 4
  • 变量为数组时,${#string} 等价于 ${#string[0]}

提取子字符串

例:

从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} 
# 输出 unoo
  • 注意:第一个字符的索引值为 0

查找子字符串

: 查找字符 io 的位置(哪个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4
  • 注意: 以上脚本中 ` 是反引号,而不是单引号


2.2.4 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。


定义数组

Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者 :

array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组 :

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}


2.2.5 运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awkexprexpr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(**注意使用的是反引号 ` 而不是单引号 ’ **):

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

运行结果:

两数之和为 : 4

注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
  • 完整的表达式要被反引号 ` ` 包含


2.2.5.1 算术运算符
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b $/ $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:

  • 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
  • 乘号(*)前边必须加反斜杠( \)才能实现乘法运算;
val=`expr $a \* $b`


2.2.5.2 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

例: 假定变量 a 为 10,变量 b 为 20:

-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。


2.2.5.3 布尔运算符

例: 假定变量 a 为 10,变量 b 为 20:

!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。


2.2.5.4 逻辑运算符

例: 假定变量 a 为 10,变量 b 为 20:

&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR`[[ $a -lt 100


2.2.6 基本流程控制

在Shell中 , 流程控制不可为空 ,

例如 如果else分支没有语句执行 ,就不要写这个else


2.2.6.1 if条件判断

格式:

# if
if condition   # condition为条件表达式,  (then 可以写在上面 写成if condition; then)
then
    command1   #
    ...
fi

#if else
if condition
then
    command1 
else
    command
fi

#if else-if else
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

#写成一行
if condition; then command1; fi

注意事项:

  • 如果使用方括号 […] 作为判断语句 , 大于使用要 -gt,小于使用 -lt

    if [ "$a" -gt "$b" ]; then
        ...
    fi
    
  • 如果使用 ((...)) 作为判断语句 , 大于和小于可以直接使用 ><

    if (( a > b )); then
        ...
    fi
    


2.2.6.2 for循环

格式:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

#或
for((初始值;限制值;执行步长))
do
	command
done

#写成一行
for var in item1 item2 ... itemN; do command1; command2… done;
  • 当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值
  • 命令可为任何有效的 shell 命令和语句。
  • in 列表可以包含替换、字符串和文件名。
  • in列表是可选的,如果不用它,for循环使用命令行的位置参数。

例:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

输出结果:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

顺序输出字符串中的字符:

#!/bin/bash

for str in This is a string
do
    echo $str
done

输出结果:

This
is
a
string


2.2.6.3 while 循环

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。

格式为:

while condition
do
 command
done

例:

如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

输出

1
2
3
4
5


无限循环

无限循环语法:

while :
do
    command
done

while true
do
    command
done

for (( ; ; ))


2.2.6.4
  • case … esac 是一种多分支选择结构,每个 case 分支用右圆括号)开始,
  • 用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句
  • esac(就是 case 反过来)作为结束标记。
  • 可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

格式 :

casein
模式1)
    command1;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
  • case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号) 结束
  • 取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

输出

输入 14 之间的数字:
你输入的数字为:
3
你选择了 3


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!感谢提问。下面是有关 K210 学习笔记五中串口通信的一些内容: 在 K210 开发板上,串口是一种常见的通信接口,用于将数据从一个设备传输到另一个设备。串口通信通常使用 UART (Universal Asynchronous Receiver/Transmitter) 协议。 要在 K210 上进行串口通信,首先需要使用两个引脚:一个用于接收数据(RX),一个用于发送数据(TX)。这些引脚可以通过 GPIO 端口与外部设备连接。 在 K210 的开发环境中,可以使用 MaixPy 或者 Kendryte Standalone SDK 进行串口编程。 在 MaixPy 中,可以使用 `uart` 模块来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```python from machine import UART uart = UART(UART.UART1, 115200) ``` 然后,可以使用 `uart.write()` 函数发送数据,使用 `uart.read()` 函数接收数据。例如: ```python uart.write("Hello, world!\n") data = uart.read(10) ``` 在 Kendryte Standalone SDK 中,可以使用 `uart.h` 头文件中的函数来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```c #include "uart.h" uart_init(UART_DEVICE_1, 115200); ``` 然后,可以使用 `uart_send_data()` 函数发送数据,使用 `uart_receive_data()` 函数接收数据。例如: ```c uart_send_data(UART_DEVICE_1, "Hello, world!\n", 14); char buffer[10]; uart_receive_data(UART_DEVICE_1, buffer, 10); ``` 以上是关于 K210 学习笔记五中串口通信的简要介绍。如果你有更具体的问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值