文章目录:
  1. 基础操作
    1. (1)目录相关操作
    2. (2)文件相关操作
    3. (3)Vim文本编辑器:
      1. 模式
      2. 基础操作
      3. 移动光标
      4. 编辑文本
      5. 复制粘贴
      6. 撤销重做
    4. (4)查找操作
    5. (5)其他操作
  2. 实用工具
    1. (1) GCC
    2. (2)Makefile
    3. (3)ctags
    4. (4) tmux
  3. Git使用
  4. Shell脚本
    1. 语法基础
  5. 流、管道、重定向
    1. (1)几种流
    2. (2)输出重定向
    3. (3)输入重定向
    4. (4)管道

CLI = Command Line Interface 命令行

基础操作

(1)目录相关操作

1 进入目录cd [选项] 目录 (change directory)

其中/为根目录,~为当前用户目录,.表示当前目录(目录前面不加/相当于./),..表示上一级目录,-跳转到上一次的目录。

2 查看目录文件: ls [选项] [目录] (list)

选项(常用):
-a              显示隐藏的文件(all)
-l              每行只列出一个文件(long)

3 创建目录: mkdir [选项] 目录 (make directory)

4 查看当前绝对路径: pwd [选项] (print working directory)

5 删除空目录:rmdir [选项] 目录 (remove directory)

(2)文件相关操作
Linux系统中不区分文件后缀,所有文件/目录都是文件

1 创建新文件: touch [选项] 文件名

当文件存在时更新文件的时间戳,当文件不存在时创建新文件

2 删除文件: rm [选项] 文件 (remove)

选项(常用):
-r              递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除。(recursive 递归)
-f              强制删除,不提示用户确认,忽略不存在的目录。(force 强制)
-i              逐一提示用户确认每个将要被删除的文件。(interactive)

常用:rm -rf *(清空当前目录,*不包括隐藏文件)

3 复制文件: cp [选项] 源文件 目标路径 (copy)

将源文件(也可以是目录)复制为目标路径对应的文件(如果目标路径是文件)或复制到目标路径(如果目标路径是目录)。

选项:-r 递归复制目录及其子目录内的所有内容 (recursive 递归)

4 移动文件:mv [选项] 源文件 目标路径 (move)

将源文件(也可以是目录)移动为目标路径对应的文件(如果目标路径是文件)或移动到目标路径(如果目标路径是目录)。

选项(常用):
-v              显示详细的操作信息。(verbose 详细输出)
-i              进行交互式操作,在覆盖前询问。(interative)
-u              仅在源文件较新,或目标文件不存在时,才执行移动操作。(update)

重命名文件:e.g. mv test.txt text1.txt

5 文件比较:diff [选项] 文件1 文件2 (difference)

选项(常用):
-b              不检查空白字符的不同。(blank)
-B              不检查空行。(Blank lines)
-q              仅显示有无差异,不显示详细信息。(quiet)

6 权限设置

chmod +x 文件名

权限可以写成类似于755这种,替换+x,比较容易记忆。(读=4,写=2,执行=1;文件所有者-同组用户-其他用户)

7 读取/拼接

cat [选项]... [文件]...,如果不指定文件,则从标准输入读取内容。

cat file.txt # 查看文件内容/输出
cat file1.txt file2.txt # 拼接文件并输出
cat file1.txt file2.txt > newfile.txt # 拼接文件并输出到新文件
cat > newfile.txt # 从标准输入读取并输入到新文件
(3)Vim文本编辑器:

vim 文件 ,若文件不存在也会创建。

修改配置:vim ~/.vimrc,可以询问AI做一些配置。例如:

image-20260310200007027

模式

分为三个模式:Normal、Insert、Commend-line。模式切换:

基础操作
:w      " 保存
:q      " 退出
:wq     " 保存并退出
:q!     " 强制退出不保存
移动光标

上面配置set mouse=a可以使用鼠标移动光标。

基础移动
h j k l:左下上右
w:        跳到下一个单词开头
b:        跳到上一个单词开头
e:        跳到单词末尾
行与文件
0:    行首
^:    行首第一个非空字符
$:    行尾
gg:    文件开头
G:    文件结尾
:n:    跳到第 n 行(如 :120)
翻页
Ctrl + f:    下一页
Ctrl + b:    上一页
Ctrl + d:    下翻半页
Ctrl + u:    上翻半页
编辑文本
删除
x:    删当前字符
dd:    删整行
dw:    删到下一个单词开头
d$:    删到行尾
修改(删并进入插入)
cw:    改一个单词
cc:    改整行
C:    改到行尾(等价 c$)
插入相关
I:    跳到行首并插入
A:    跳到行尾并插入
O:    在上方新开一行插入
复制粘贴

(复制yank 粘贴paste)

yy:        复制当前行
yw:        复制一个单词
p:        在后面粘贴
P:        在前面粘贴
dd 后 p:    相当于剪切并粘贴
撤销重做
(4)查找操作

1 查找文件: find [路径] <选项>

在给定路径下递归地查找文件,输出符合要求的文件的路径。如果没有给定路径,则在当前目录下查找。

选项(常用): -name <文件名> 指定需要查找的文件名。

2 匹配内容搜索: grep [选项] PATTERN FILE

PATTERN是匹配字符串,FILE是文件或目录的路径。

选项(常用):
-a              不忽略二进制数据进行搜索。
-i              忽略大小写差异。
-r              从目录中递归查找。
-n              显示行号。

3 文件树tree [选项] [文件名]

选项(常用):
-a              列出全部文件(包含隐藏文件)。
-d              只列出目录。

4 文件处理sed [选项] 命令 文件

选项:
-n:关闭默认输出,只有显式打印的内容才会显示。
-i:直接修改文件内容,而不是只输出到屏幕。
-e: 执行多条命令

常见命令:
<行号>a\内容:在指定行后追加一行。
<行号>i\内容:在指定行前插入一行。
<行号>c\内容:用指定内容替换该行(或范围行)。
<行号>d:删除指定行。
<行号>p:打印指定行,通常和 -n 一起使用。
s/正则/替换内容/:替换匹配内容,默认每行只替换第一个;加 g 表示全局替换。

说明:
- 行号可以是数字,如 3
- 也可以是范围,如 2,5,不加一边默认代表到开头/结尾
- $ 表示最后一行

5 文本分析工具: awk [选项] '条件 { 动作 }' 文件

选项:
-F 分隔符:指定输入字段分隔符。默认用空格或 Tab 分隔。
-v 变量=值:在执行 awk 程序前,先定义变量。

基本结构:
条件 { 动作 }

说明:
- 条件可以省略,省略时表示每一行都执行动作
- 动作可以省略,省略时表示默认输出当前整行
- 条件和动作都可以结合使用

常用内置变量:
$0:当前整行
$1:第 1 列(列指的是按照前面-F分隔符的不同块,默认空格/Tab)
$2:第 2 列
...
$NF:最后一列
NF:当前行的字段数(列数)
NR:当前处理的是第几行
FNR:当前文件中的第几行
FS:输入字段分隔符
OFS:输出字段分隔符

常见用法:
{print}:输出当前整行
{print $1}:输出第 1 列
{print $1,$3}:输出第 1 列和第 3 列
NR==2 {print}:输出第 2 行
NF>=3 {print $1,$3}:输出列数不少于 3 的行的第 1、3 列
$1=="root" {print $0}:输出第 1 列等于 root 的行
BEGIN{动作}:在读入所有内容前先执行
END{动作}:在处理完所有内容后再执行
(5)其他操作

man :命令使用说明

唱跳Rap篮球(Ctrl+C):终止程序

Ctrl+Z:挂起程序,恢复程序使用fg [job_spec]

Ctrl+D:终止输入

Ctrl+L:清屏

echo:输出文本,echo [选项] [字符串]

实用工具

(1) GCC

gcc [选项] 源代码文件,用于编译C语言代码。

gcc cxk.c # 编译
./a.out # 运行a.out
# or
gcc -o hello hello.c # -o可以设置生成可执行文件的名字

image-20260310200849430

(2)Makefile

make是一个C语言项目构建工具,每次只用重新编译必要的部分,其指导文件为Makefile,表现目标之间的依赖关系和构建方法。

格式:

target: dependencies
    command 1 # 前面必须是制表符
    command 2
    ...
    command n

target为这个目标的名称,dependencies为其依靠的目标/文件。每次make编译时递归检查比较目标和依赖文件的时间戳,决定是否重新编译。

如果想要构建 target,那么首先要准备好 dependencies,接着执行 command 中的命令,以得到 target

运行:make target / make

因为上述依赖检查都依靠于文件,有一些make里面的“目标”并不是一个文件,为了避免之后目录下出现对应文件而发生检查时的问题,可以在Makefile设置伪目标.PHONY targets放在任意位置即可,通常把clean设置为一个为目标。

Makefile中的变量都是字符串,且无需引号。赋值语法:<变量名> := <变量值>,访问变量的值:$(<变量名>)

(3)ctags

一个方便代码阅读的工具,可以进行代码变量跳转。

目录下生成符号名索引文件:ctags -R *

Vim中查看索引:Ctrl+],跳转符号定义处;Ctrl+o/Ctrl+T,返回。

(4) tmux

分窗口程序。

用不明白。。还是老老实实一个一个看吧

启动:tmux

image-20260303203354183

Git使用

软工基础学过了

分为工作区、暂存区、本地库、远程库

分为四个状态:

Git Change

常用命令:

本地基本操作

远程仓库:

分支管理:

Shell脚本

运行脚本:bash my.sh,或者,

修改执行权限之后(e.g. 755)再使用./my.sh

语法基础

1 打印输出

echo "hello OS" # 注释使用#号

2 变量 :Shell定义变量无需指定类型,赋值等号两边不允许有空格,用$var_name可以获取变量的值。

#!/bin/bash
str="world, hello"
echo $str

3 脚本参数: 用于命令/函数参数传递,类似$1$2,特殊的:$#为传递参数个数,$*为传递的全部参数(字符串),$?表示前一个命令返回值。

4 条件与循环

if、then(if或elif条件下一行接)、elif、else、fi(结束语块),比较整数的大小(())

#!/bin/bash
if (( $1 > $2 ))
then
        echo "first > second"
elif (( $1 < $2 ))
then
        echo "first < second"
elif (( $1 == $2 ))
then
        echo "first == second"
else
        echo "I don't know..."
fi

while、do、done(结束)

while condition
do
    command1
    command2
    ...
done

比较大小还可以使用:

image-20260310212951842

5 函数

函数的定义:

function fun_name() {
    body...
    return int_value;
}

其中 function() 可以省略其中一个。其中返回语句是可选的,函数可以不返回值。int_value 是一个[0,255]之间的整数

函数调用:fun_name param1 param2 ... paramN

流、管道、重定向

(1)几种流

标准流是这样的:(即输入来自键盘,输出到屏幕)

键盘 -> stdin -> 命令 -> stdout/stderr -> 屏幕

重定向即把标准输入改到别的地方读,标准输出/错误改到其他地方。

(2)输出重定向

「1」 >:把标准输出写到文件里,覆盖原内容

echo hello > a.txt

把hello输出重定向到文件a.txt,并覆盖其内容

「2」 >>:与上面不同的是,不覆盖,而是添加到末尾

「3」错误重定向:2>2>>

常用:2>&1,把错误输出 2 重定向到标准输出 1 当前去的地方。

(3)输入重定向

<:把文件内容当做命令标准输入。

(很多命令下,和直接读文件似乎区别不大

(4)管道

管道 = 把前一个命令的标准输出,直接接到后一个命令的标准输入。

命令1 的 stdout --> 命令2 的 stdin