dong-frank的博客

Linux系统基础 2024.7.25

字数统计: 1.8k阅读时长: 7 min
2024/07/27

其他命令的学习

类似于一个三通管道,将输入即显示在终端上也写入到指定文件中
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129

## 软件包更新
```apt update```
```apt upgrade```
```apt dist-upgrade``` 大版本更新,谨慎使用

## 软件包管理
```apt-cache -n search``` 搜索软件包
```apt install``` 安装软件包
```apt --purge remove``` 卸载软件包 --purge删除配置文件
```apt list --installed | grep``` 查看软件包是否安装
```dpkg -l``` 底层的查看软件包是否安装
```dpkg -L``` 查看软件包内所含的文件
```dpkg -S command``` 查看命令来自哪个软件包

# Linux系统命令行下如何进行文字编辑

该学哪个代码编辑器
> 20小时定律
> 边学习边查阅
> 坚持用这个编辑器完成任务

## vim 命令行编辑器
### vim历史
1976年,Bill Joy发布vi
1991年,Bram Moolenaar发布vim *vi imitation -> vi improved*

### vim的设计哲学
**有"模式"的编辑器**
通过模式的转换,命令的组合和数以万计的插件,保证程序员在编程的过程中,双手尽可能保留在键盘的中央区域
**让双手跟上思维的速度**

### vim的使用
安装 ```sudo apt install vim-nox```

缓存:打开的文件

窗口:多个窗口可以对应同一个缓存

标签
```:sp```水平分隔窗口
```:vsp```垂直分隔窗口
```c-w w```光标在窗口间的切换
```:tabnew```新建一个标签
```:tabn```在标签间切换 正常模式```gt```

#### vim的模式
1. 正常模式
1. 默认的模式
2. 在任何其他模式中,都可以通过键盘上的esc键返回正常模式
2. 插入模式
1. 输入文本时使用
2. 在正常模式下键入i(insert) 或 a(append)即可进入该模式
3. 替换模式
1. 替换文本时使用
2. 在正常模式下键入r 或 R 即可进入该模式
4. 可视化模式
1. 用于选定文本块
2. 在正常模式下键入v来按字符选定
3. s-v (shift-v)按行选中
4. c-v (ctrl-v)按块选中
5. 命令模式
1. 用于执行命令
2. 在正常模式下键入: 即可进入
3. 使用/或?开始搜索也算进入命令模式

#### vim的命令
```w```:write 保存
```q```:quit 退出
```wq```:保存并退出
```q!```:强制退出

#### vim的正常模式的本质
正常模式就是vim的编程接口,本质上就是一种编程语言
```h,j,k,l```左下上右移动光标
```w```word 按单词跳转 ```W```按变量名跳转
```b```back 向后跳转单词 ```B```向后按变量名跳转
```e```end 跳转到单词结尾
```$``` 跳转到行末
```0``` 跳转到行首
```c-f``` 向后翻页 ```c-d``` 向后翻半页
```c-b``` 向前翻页 ```c-u``` 向前翻半页

```G``` 跳转到文件末尾
```gg``` 跳转到文件开头

```o``` 在当前行下面插入一行 ```O```在当前行上面插入一行

```d-移动命令``` 删除 **注意移动命令跳转到哪里就是删除到哪里**
```u``` undo 撤销
```ctrl-r``` 恢复撤销

```c``` change

```x``` 删除当前光标的字符

```y``` 复制
```p``` 黏贴

```.``` 重复刚才的操作

```移动命令+数字```

```t``` to
```f``` find

```ci(``` change in () 改变单括号里的内容

### vim插件安装


# Shell脚本

## 变量
- 变量赋值
- ```foo=bar```
- ```foo = bar``` shell会认为foo是一个命令,```=```和```bar```是两个参数
- 获取变量值
- ```echo $foo```
- 单引号和双引号
- ```echo " this is a foo's value $foo"``` this is a foo's value bar
- ```echo ' this is a foo's vaule $foo'``` this is a foo's value $foo

## 函数
```shell
mcd () {
mkdir -p "$1"
cd "$1" //$1表示第一个参数 (1~9) $0 表示函数本身
}

declare -f mcd 查看函数的定义或者type mcd

函数既可以直接定义,也可以在文件中定义

函数调用:在命令行直接调用

如果在文件中定义 mcd.sh
bash mcd.sh 相当于启动一个mcd.sh的子进程,此时父进程中没有这个函数
source mcd.sh相当于在父进程中重新打了一遍这个函数 . mcd.sh也可以

常见特殊变量

$0 脚本名
$1~9 参数
$? 上一条命令的执行情况 0表示成功,其他表示失败 shell中常见的控制流
$_ 上一条命令的最后一个参数
$# 参数数
$$ 进程号

!! bangbang 完整的上一个命令,包括参数

特殊变量完整列表

退出码结合&& ||

false || echo "Oops,fail"
true || echo "Will not be printed"
false ; echo "This will always run"分号分隔两个命令

命令替换,进程替换

$(CMD)
echo "We are in $(pwd)"

进程替换 <(CMD)
把命令执行的结果存到一个临时文件中
diff <(ls .) <(ls ..)比较当前文件目录和上一级目录的不同

通配 globbing

通配符* ?
?表示匹配一个字符
*表示匹配零个或任意个字符
ls *.sh

{}
convert image.{png,jpg}
展开为convert image.png image.jpg

[]匹配方括号内的任意一个字符

可以通过echo来判断会扩展成什么样子

关于通配和变量的区别
mv test/*.txt test2 是完整路径的扩展
file="a.txt b.txt"
mv test/$file test2 是字面意义的扩展

脚本检查工具

Shellcheck

Shell函数vs脚本

  • 函数只能与shell使用相同的语言,脚本可以使用任意语言
  • 函数仅在定义时被加载,脚本会在每次执行时被加载
  • 函数会在当前shell环境中执行,脚本会在单独的进程中执行

Shell 工具–查找文件

find <搜索起点> -name <文件名> -type <类型>
find . -name src -type d

find . -path '**/test/*.py' -type f 两个**表示任意层级的文件

查找当前目录下前一天修改的所有文件
find . -mtime -1

查找当前目录下所有大小在100k至1M的后缀为.tar.gz的文件
find . -size +100k -size -1M -name '*.tar.gz'
压缩.tar.gz :tar -zcf test.tar.gz test
解压缩 : tar -zxf test.tar.gz

删除当前目录下后缀为.tmp的所有文件
find . -name '*.tmp' -exec rm {} \; 一行删除一个文件,防止出错
find . -name '*.tmp' -exec rm -- {} + +表示全在一行删除, – 表示后面的参数都不是rm的参数防止出错

locate命令:非即使搜索文件
每日会定时更新文件的数据库 cron程序
/etc/crontab
updatedb负责更新后台数据库

Shell 工具–查找文件内容

grep text file
grep -R text .递归搜索当前目录
grep -C 2 text *获取匹配文本的上下文
grep -v text file输出不匹配的结果

第三方工具rg

Shell 工具–查找打过的命令

history
history | grep cd

!!执行上一条命令
!cd执行上一条cd命令
!cd:p把上一条cd命令打印出来

c-r交互式的显示查找命令

命令前面加空格就不会被历史记录记下 防止密码泄露

CATALOG
  1. 1. 其他命令的学习
    1. 1.1. 常见特殊变量
    2. 1.2. 退出码结合&& ||
    3. 1.3. 命令替换,进程替换
    4. 1.4. 通配 globbing
    5. 1.5. 脚本检查工具
    6. 1.6. Shell函数vs脚本
    7. 1.7. Shell 工具–查找文件
    8. 1.8. Shell 工具–查找文件内容
    9. 1.9. Shell 工具–查找打过的命令