Linux
What is Linux?
- 一个Linux发行版(例如Ubuntu):
- Linux内核
- GNU项目:一个自由软件集合
- 其它软件和库
Linux基础操作
1 | 命令名 [选项][参数]... |
- [ ]:意为可选0~n个
- 可通过
man命令来查看具体命令的使用说明1
man [选项] 命令
目录操作
1 | cd directory |
在需要键入文件名或目录名时:
可以使用 Tab 自动补足全名,双击 Tab 可以显示所有可能选项
/:根目录~:当前用户主目录- 普通用户($):
/home/username - root(系统管理员)用户(#):
/root
- 普通用户($):
.:当前目录..:上一级目录-:上一次访问的目录
1 | ls [选项] [目录] |
- 选项(常用):
-a显示隐藏的文件-l每行只列出一个文件
1 | mkdir [选项] 目录 |
1 | pwd [选项] |
- 作用:输出当前目录的绝对路径
1 | rmdir [选项] 目录 |
- 作用:删除空目录
文件操作
支持对多个文件的操作,例如使用*来匹配任意长度的字符串
1 | touch [选项] 文件名 |
- 作用:当文件存在时更新文件的时间戳,当文件不存在时创建新文件。
1 | rm [选项] 文件 |
- 选项:
-r:递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除-f:强制删除,不提示用户确认,忽略不存在的目录-i:逐一提示用户确认每个将要被删除的文件
1 | cp [选项] 源文件 目标路径 |
- 选项:
-r:递归复制目录及其子目录内的所有内容
1 | mv [选项] 源文件 目标路径 |
- 作用:
- move
- rename:例如
mv test.txt test2.txt
- 选项:
-v:显示详细的操作信息-i:覆盖前询问-u:(仅在有必要时移动)仅在源文件较新,或目标文件不存在时,才执行移动操作
- 多源移动;当有多个源时,最后一个参数必须是目录
1 | diff [选项] 文件1 文件2 |
- 作用:比较
- 选项:
-b:不检查空白字符的不同-B:不检查空行-1:仅显示有无差异,不显示详细信息
1 | cat 文件 |
- 作用:将文件内容输出到标准输出
1 | echo <text> |
- 作用:print
- 默认添加换行符,所以即使echo ''并非空(需要 -n去除)
查找操作
1 | find [路径] <选项> |
- 作用:在给定路径/当前目录下查找
- 选项:
-name <文件名>:指定需要查找的文件名
1 | grep [选项] PATTERN FILE |
(PATTERN是匹配字符串,FILE是文件或目录的路径)
- 作用:输出匹配PATTERN的文件和相关的行。
- 选项:
-a:不忽略二进制数据进行搜索。-i:忽略大小写差异。-r:从目录中递归查找。-n:显示行号。-v:反向过滤-w:按独立单词匹配-o:只输出匹配到的部分
- 例如:
grep hello a.txt - 可使用正则表达式作匹配
'^a':匹配行首为a的行'end$':匹配行尾为end的行'[0-9]'
1 | tree [选项] [目录名] |
- 作用:输出一个目录下的文件树。
- 选项:
-a:列出全部文件(包含隐藏文件)-d:只列出目录
快捷键
ctrl + c:终止程序执行ctrl + z:挂起当前程序ctrl + d:终止输入(相当于输入一个EOF)ctrl + l:清屏ctrl + s/ctrl + q:暂停/启动终端
GNU工具
GCC
即GNU编译器套件。
1 | gcc [选项] 源代码文件 |
- 作用:编译源代码文件
- 选项:
-o example - 若编译成功,同目录下出现
a.out可执行文件- 执行
./a.out即可输出 - 需要传参?可类比:
./casegen.out add 100 > case_add
- 执行
make
- make工具:根据Makefile中规则,自动化编译和构建项目
Makeflie- 由一系列rules构成,每条rule形式如下:
1
2<target> : <prerequisites>
[tab] <commands> - target
- 通常是文件名:指明Make命令所要构建的对象
- 也可以是某个操作的名字,这称为phony ,例如:
1
2
3.PHONY: clean
clean:
rm *.o temp - 若Make命令没有指定目标,默认会执行Makefile文件的第一个目标
- prerequisites(前置条件)
- 通常是一组文件名,之间用空格分隔
- 用法:生成多个文件

- 本质:若某个文件变化,会导致目标过期,则当前目标依赖该文件
- 注意区分与伪目标(调用就执行,不关心过期)
- commands(命令)
- 注意:需要注意的是,每行命令在一个单独的shell中执行。这些Shell之间没有继承关系。
- 这种“独立”只反映在shell变量上,而不影响磁盘上文件的改变
- 注意:需要注意的是,每行命令在一个单独的shell中执行。这些Shell之间没有继承关系。
- 多级Makefile:
- 调用下级Makefile:
make -C subfile xxx
- 调用下级Makefile:
- Grammar
#- echoing回声
- 正常情况下,make会打印每条命令,然后再执行,这就叫做回声
- 在命令的前面加上
@,就可以关闭回声
- wildcard通配符

- 模式匹配:
% - 变量和赋值符
- 调用时,要把变量放在
$()中 - 赋值运算符:常用
:=
- 调用时,要把变量放在
- 内置变量
$(CC):指向当前使用的编译器
- 自动变量
$@:代指当前target$<:代指第一个前置条件$?:代指比目标更新的所有前置条件$^:代指所有前置条件,之间以空格分隔$*:指代匹配符%匹配的部分
- 循环和判断:遵循bash语法
- 由一系列rules构成,每条rule形式如下:
ctags
在~/.vimrc中添加配置:
1 | set tags=tags |
- 功能:代码跳转
ctrl+]跳转至相关定义文件位置ctrl+o返回跳转前位置
tmux
终端复用工具
输入tmux进入tmux新对话
- 重要快捷键:

Git

- 工作区
- 暂存区
- 版本库

- untracked:未跟踪,未被git跟踪的状态
- unmodified:未修改,版本库版本和工作区版本一致
- modified:已修改,版本库版本和工作区版本不一致
- staged:已暂存,修改版本已提交至暂存区,但尚未上传
Git常用指令
基本提交
git init
git clone <URL>:“克隆”一个已有的储存库到当前目录下
git status:查看当前分支状态
git add:将新文件/已修改文件加入暂存区
git add .:add所有修改进入暂存区git add <filename>
git checkout:切换分支(需要保证当前所有文件状态为未修改)
git commit:git commit -m <message>
- 将暂存区的修改提交到储存库中
git log:查询提交记录
撤销指令
- 工作区撤销
git restore <file>把工作区文件恢复到暂存区版本 - 暂存区撤销
git restore --staged <file>把文件从暂存区取出,但还保留工作区文件 - 删除未跟踪文件
git clean -f
版本回退
- 版本库回到上一个提交
git reset --hard HEAD^ - 版本库回到指定提交
git reset --hard <hash>- hash: 对应提交的hash值,可用git log获取
远程本地同步
- 远程->本地:
git pull [远程仓库名] [远程仓库分支]:[本地仓库分支] - 本地->远程:
git push [远程仓库名] [本地仓库分支]:[远程仓库分支]git restore:取消修改 - 未add入暂存区时:
git restore <filename>来撤销对这个文件的修改,使其退回到上一个 commit 的状态 - 已add入暂存区后:
git restore --staged <filename>将文件移除暂存区,再次restore
Shell
Shell,即操作系统的“外壳”(相对“内核”而言),是用于访问操作系统服务的用户界面
分类
GUI Shell
- GUI:
- Graphical User Interface
CLI Shell
- CLI:
- Command Line Interface:命令行界面
Shell脚本语言
Shell脚本的执行
- 约定脚本文件的文件名以
.sh结尾 - 执行Shell脚本:
./文件名- 前提:脚本文件有“执行”权限
- 用
chmod +x filename添加执行权限
Bash Shell语法基础
1 |
|

- 变量:无需指定类型,但是等号两边不允许空格
- 使用
${var_name}/$var_name可以获取变量的值 - 数组:
i=(1 2 3 4)
- 脚本参数
特殊变量:
$#:传递的参数个数$*:一个字符串,内容是传递的全部参数$?:函数返回值$N:当N>=10时,需使用${N}使用特殊变量时,尽量加上双引号"",防止解析错误
- 条件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15if condition1
then
command11
command12
......
elif condition2
then
command21
command22
......
else
command31
command32
......
fi
- 整数比较方法:
((condition))
- 循环
1 | while condition |
- 计算
- 以下等价:
let i=i+1i=$((i+1))
- 运算符:
(()):结果非零时返回0(真)$(()):直接返回计算数值结果[]:条件为真时返回0- [ -s < file> ]:文件非空
[[]]:支持&&等逻辑符
- 以下等价:
- 函数
- 定义:(如果要返回值,必须返回一个[0,255]之间的整数)
1
2
3
4function fun_name() {
body...
return int_value;
} - 调用:
fun_name param1 param2 ... paramN
- 变量字符串分割
1
2${name:1:3} //${变量:起始位置:长度}
${name:0:(-3) }//去掉末尾3个字符
sed
通过命令编辑和输出文本的工具
1 | sed [选项] '命令' 文件 |
- 选项
-n:安静模式,只显示经过sed处理的内容。否则显示输入文本的所有内容。-i:直接修改读取的档案内容,而不是输出到屏幕。否则,只输出不编辑。-e: 允许在同一行里执行多条命令,例如sed -e '4astr ' -e 's/str/aaa/' my.txt
- 命令:
- <行号>a<内容>: 新增,在行号后新增一行相应内容。行号可以是“数字”,在这一行之后新增,也可以是“起始行,终止行”,在其中的每一行后新增。当不写行号时,在每一行之后新增。使用$表示最后一行。后面的命令同理。
- <行号>c<内容>:取代。用内容取代相应行的文本。
- <行号>i<内容>:插入。在当前行的上面插入一行文本。
- <行号>d:删除当前行的内容。
- <行号>p:输出选择的内容。通常与选项-n一起使用。
- ‘n,mp’:输出
[n,m]行
- ‘n,mp’:输出
- s/
/ :将 (正则表达式)匹配的内容替换为 - 默认只作用于每一行的第一个匹配项
- 末尾标识符
g:作用于所有,e.g.sed -i "s/char/int/g" file
awk
文本处理工具
awk '条件 { 动作 }' 文件名
-
awk默认:
- 一次读取1行
- 把这一行拆成若干字段,用空白字符分割每一列
- 执行规则
-
常用内置变量
$0:整行$n:第n列NF:当前行的字段数NR:当前是第几行OFS:输出字符分隔符
-
例如:
awk '$2 > 80 {print $0}' score.txt:当第二列大于80时,输出一整行awk -F ',' '{print $1, $3}' test.csv:输入分隔符为,
-
一定要注意用
''包裹条件&动作,防止解析错误
重定向
在命令后添加
> output.txt:覆盖原有内容,若不存在则新建>> output.txt:追加内容 即可将输出重定向到文件中,而非原本的控制台上<:输入重定向- 标准流:
>是1>的简写 tips:- 重定向不能创建目录,只能创建文件
管道
管道符号|可以对命令进行连接
e.g.+
1 | grep -n "key" file1.txt | cut -d ":" -f 1 |
- cut:
-d ":":以":"作为分隔符-f n:取第n块-f n、m-f n-m