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

1
-rw-rw-r--    

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



1.3.2权限修改命令chmod

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

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

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

主要参数如下:

-c 效果类似“

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

-f 不显示错误信息。

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

-v 显示指令的执行过程

例:

file3.c文件权限修改为766

image-20230404153715678



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
2
#!/bin/bash
#表示使用bash。

shell基本写法

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

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

运行shell脚本:

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

1
2
chmod +x ./test.sh  #使脚本具有执行权限
./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
2
3
4
5
6
7
8
9
10
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

输出结果

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

获取字符串长度

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

查找子字符串

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

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不支持简单的数学运算,但是可以通过其他命令来实现,例如 awkexprexpr 最常用。

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

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

1
2
3
4
#!/bin/bash

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

运行结果:

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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

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

    1
    2
    3
    if (( a > b )); then
    ...
    fi


2.2.6.2 for循环

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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循环使用命令行的位置参数。

例:

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

输出结果:

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

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

1
2
3
4
5
6
#!/bin/bash

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

输出结果:

1
2
3
4
This
is
a
string


2.2.6.3 while 循环

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

格式为:

1
2
3
4
while condition
do
command
done

例:

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

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

输出

1
2
3
4
5
1
2
3
4
5


无限循环

无限循环语法:

1
2
3
4
while :
do
command
done

1
2
3
4
while true
do
command
done

1
for (( ; ; ))


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

格式 :

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

:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

输出

1
2
3
4
输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

-------------已经到底啦! -------------