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 就表示没不具备此权限
以这个为例:
1 | -rw-rw-r-- |
分别表示 文件所属用户 、文件所属用户组 、 其他用户 的权限
1.3.2权限修改命令chmod
命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使
用字母表示,命令格式如下:
1 | chmod [参数] [文件名/目录名] |
主要参数如下:
-c 效果类似“
-v 参数,但仅回显更改的部分。
-f 不显示错误信息。
-R 递归处理,指定目录下的所有文件及其子文件目录一起处理。
-v 显示指令的执行过程
例:
将file3.c
文件权限修改为766
2️⃣
2.1 gcc编译器
gcc 命令格式如下:
1 | 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脚本第一行 一定 要为:
1 | !/bin/bash |
shell基本写法
下面是一个简单的"hello world"
的shell脚本 test.sh
1 | !/bin/bash |
运行shell
脚本:
因为.sh
文件默认没有执行权限 , 所以要给其权限:
1 | chmod +x ./test.sh #使脚本具有执行权限 |
2.2.2 shell 变量
定义变量时,变量名不加美元符号
1 name="yzt"变量名和等号之间不能有空格 , 变量的命名需要遵循以下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线
_
。- 不能使用标点符号。
- 不能使用
bash
里的关键字(可用help命令查看保留关键字)。使用变量的时候 , 只要在变量前面加一个美元
($)
符号就行 ,
1
2
3 echo $name
也可以在变量外面加上花括号
echo ${name}
系统变量:
$n | n 的值为0~n , 表示shell脚本的参数 , $0 表示当前运行的脚本文件本身 , $1 表示第一个参数 , $2 表示第二个参数 . … |
---|---|
$# | 命令行的参数 个数 |
$? | shell运行的前一个命令的返回码 |
$* | 以"($1 ) ($2 ) …" 形式的所有参数组成的字符串 |
$@ | 以 “($1 )” “( $2 )” … 形式的所有参数组成的字符串 |
$$ | 当前脚本程序的进程ID |
$! | shell运行的前一个命令的进程ID |
只读变量
使用
readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变。
1
2 name="yzt"
readonly myUrl
删除变量
使用
unset
命令可以删除变量
1 unset name
- 变量被删除后不能再次使用,
unset
命令不能删除 只读变量
变量类型
shell
中的变量存在三种类型
- 局部变量 : 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 : 所有的程序,包括
shell
启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell
脚本也可以定义环境变量- shell变量 :
shell
变量是由shell
程序设置的特殊变量。shell
变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell
的正常运行
2.2.3 字符串
单引号字符串
- 单引号里的任何字符都会原样输出,单引号字符串中的 变量是无效 的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
1 str='string'
双引号字符串
- 双引号里可以有变量
- 双引号里可以出现转义字符
1
2 name="yzt"
str="name :\"${name}\" "输出结果为
name : "yzt"
拼接字符串
1 | your_name="runoob" |
输出结果
1 | hello, runoob ! hello, runoob ! |
获取字符串长度
1
2
3
4 string="abcd"
echo ${#string} # 输出 4
变量为数组时,`${#string}` 等价于 `${#string[0]}`
提取子字符串
例:
从字符串第 2 个字符开始截取 4 个字符:
1
2
3 string="runoob is a great site"
echo ${string:1:4}
输出 unoo
- 注意:第一个字符的索引值为 0
查找子字符串
例: 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
1
2 string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
- 注意: 以上脚本中 ` 是反引号,而不是单引号 '
2.2.4 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组
在
Shell
中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
1 数组名=(值1 值2 ... 值n)例如:
1 array_name=(value0 value1 value2 value3)或者 :
1
2
3
4
5
6 array_name=(
value0
value1
value2
value3
)还可以单独定义数组的各个分量:
1
2
3 array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组 :
读取数组元素值的一般格式是:
1 {数组名[下标]}例如:
1 valuen=${array_name[n]}使用
@
符号可以获取数组中的所有元素,例如:
1 echo ${array_name[@]}
2.2.5 运算符
原生bash
不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk
和 expr
,expr
最常用。
expr
是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加( 注意使用的是反引号 ` 而不是单引号 ’ ):
1 | !/bin/bash |
运行结果:
1 | 两数之和为 : 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 ]。
- 乘号(
*
)前边必须加反斜杠(\
)才能实现乘法运算;
1 | 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 || $b -gt 100 ]] 返回 true |
2.2.6 基本流程控制
在Shell中 , 流程控制不可为空 ,
例如 如果
else
分支没有语句执行 ,就不要写这个else
2.2.6.1 if条件判断
格式:
1 | if |
注意事项:
-
如果使用方括号
[…]
作为判断语句 , 大于使用要-gt
,小于使用-lt
。1
2
3if [ "$a" -gt "$b" ]; then
...
fi -
如果使用
((...))
作为判断语句 , 大于和小于可以直接使用>
和<
1
2
3if (( a > b )); then
...
fi
2.2.6.2 for循环
格式:
1 | for var in item1 item2 ... itemN |
- 当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取 列表中的当前取值 。
- 命令可为任何有效的
shell
命令和语句。 in
列表可以包含替换、字符串和文件名。in
列表是可选的,如果不用它,for循环使用命令行的位置参数。
例:
1 | for loop in 1 2 3 4 5 |
输出结果:
1 | The value is: 1 |
顺序输出字符串中的字符:
1 | !/bin/bash |
输出结果:
1 | This |
2.2.6.3 while 循环
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。
格式为:
1
2
3
4 while condition
do
command
done
例:
如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1
1 | !/bin/bash |
输出
1 | 1 |
无限循环
无限循环语法:
1 | while : |
或
1 | while true |
或
1 | for (( ; ; )) |
2.2.6.4
- case … esac 是一种多分支选择结构,每个 case 分支用右圆括号
)
开始, - 用两个分号
;;
表示break
,即执行结束,跳出整个 case … esac 语句 - esac(就是 case 反过来)作为结束标记。
- 可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
格式 :
1 | case 值 in |
- case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号
)
结束 - 取值可以为 变量或常数 ,匹配发现取值符合某一模式后,其间所有命令开始执行直至
;;
例 :
1 | echo '输入 1 到 4 之间的数字:' |
输出
1 | 输入 1 到 4 之间的数字: |