其他命令的学习 类似于一个三通管道,将输入即显示在终端上也写入到指定文件中 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
交互式的显示查找命令
命令前面加空格就不会被历史记录记下 防止密码泄露