【MIT】Missing Semester 第二节课笔记

这节课主要讲了各种查找,后半程有一些命令达不到老师说的效果,我没听懂就没记,不过我觉得作为初学者来说这些也足够了

自定义字符串

在终端我们可以定义自己的字符串,定义方式类似于python,在调用时需要在变量名前加上"$"。注意定义时不要加空格,并且在字符串中调用时不要用单引号。

示例

(base) ymd@WP:~$ foo=bar
(base) ymd@WP:~$ echo $foo
bar
(base) ymd@WP:~$ echo "Hello $foo"
Hello bar
(base) ymd@WP:~$ echo 'Hello $foo'
Hello $foo
(base) ymd@WP:~/practise$ foo=$(pwd)
(base) ymd@WP:~/practise$ $foo
bash: /home/ymd/practise: 是一个目录
(base) ymd@WP:~/practise$ echo "path is $foo"
path is /home/ymd/practise
(base) ymd@WP:~/practise$ echo "path is $(pwd)"
path is /home/ymd/practise

vim

这里老师讲的很不清楚,需要先说一下Vim界面的基本操作:
Vim是一款模式化的编辑器,它有三种模式:

  • 编辑模式也称为命令模式
  • 输入模式
  • 末行模式

每个模式的功能也是不一样的,当我们打开文本时是处于编辑模式的,下面说下如何在编辑模式下转入输入模式的:

编辑模式---->输入模式:

在编辑模式下进入输入模式可以使用i、a、o等命令进行数据的插入及追加等。

输入模式---->编辑模式:

我们是无法直接从输入模式转到编辑模式,需要首先介入ESC键才可以。

编辑模式---->末行模式:

从编辑模式转到末行模式介入“:”就可以进入末行模式。

末行模式---->编辑模式:

从末行模式到编辑模式介入ESC键即可,但是vim是无法直接从末行模式直接进入到输入模式,必须先到编辑模式再到输入模式。

输入命令后退出时也有多种方式:

1. 使用快捷键

按下Esc键(位于键盘的左上方),然后输入冒号(:),此时底部状态栏会显示一个冒号。接下来,在状态栏中输入q(表示退出)或q!(表示强制退出,不保存更改),然后按下回车键即可退出编辑模式。

2. 输入命令

在编辑模式中,按下冒号(:),然后在底部状态栏中输入命令。例如,输入"quit"、“q”、"exit"等命令,然后按下回车键退出编辑模式。

3. 使用组合键

有些Linux发行版配置了其他快捷键来退出Vim编辑模式。例如,可以尝试按下Ctrl + C、Ctrl + D或Ctrl + Z组合键,以退出编辑模式。

4. 保存并退出

若想保存文件并退出编辑模式,可以按下Esc键后输入冒号(:),然后输入wq(表示写入并退出),再按下回车键即可保存更改并退出编辑模式。

示例

简单来说,当输入vim mcd.sh时,我们就会进入vim界面,此时选中光标所在的地方,然后输入任意内容就会自动进入输入模式,这里我们输入文件内容:

mcd () {
        mkdir -p "$1"
        cd "$1"
}

具体来说,此脚本定义了一个名为mcd的函数。函数体内部执行了两个命令:

mkdir -p "$1":利用mkdir命令创建文件夹。选项-p表示如果目录不存在,则创建目录(递归地),“$1"表示第一个参数,即传入的文件夹名。
cd "$1":利用cd命令进入文件夹。同样,”$1"表示第一个参数,即传入的文件夹名。

然后点击ESC,输入wq(保存并退出)。输入source mcd.sh,就可以执行该脚本程序并加载它,输入mcd test,则将test传给了mcd函数,创建并进入了test文件夹。如果想要创建的文件夹已经存在,则脚本只会执行第二条命令进入文件夹。

一些美元符号的用法

符号意义
$0正在运行的脚本的名称
$1第一个参数
$2第二个参数
…………
$9第九个参数
$_访问最后一个参数
$?获取上一条命令的错误信息
$!!访问上一条指令

示例

(base) ymd@WP:~/practise$ rmdir test
(base) ymd@WP:~/practise$ mkdir tset
(base) ymd@WP:~/practise$ cd $_
(base) ymd@WP:~/practise/tset$ 
(base) ymd@WP:~/practise/tset$ $!!
$cd $_
(base) ymd@WP:~/practise/tset$

$_代替了“test”传给了cd,$!!代替了cd $_

&&,||,;

使用规则和C一样,只不过可以直接在终端输入,从左往右执行。没啥好说的直接贴图
在这里插入图片描述

脚本实战

输入vim example.sh,然后在该脚本中输入

echo "Starting program at $(date)"

echo "Running program $0 with $# arguments with pid $$"

for file in "$@";do
        grep foobar "$file" > /dev/null 2> /dev/null
        
        if [[ "$?" -ne 0 ]]; then
                echo "File $file does not have any foobar,adding one"
                echo "# foobar" >> "$file"
        fi      
done    

这段代码是一个简单的脚本,它的功能是在给定的文件中查找字符串"foobar",如果没有找到,则在文件中添加这个字符串。该脚本中的空格缺一不可,这些空格均是语法所需,而不是为了美观

解释代码的每一部分:

echo "Starting program at $(date)": 打印当前时间作为程序开始的提示信息。

echo "Running program $0 with $# arguments with pid $$": 打印脚本的名称(0),接收的参数个数(0),接收的参数个数(#),以及脚本的进程ID($$)。

for file in "$@"; do ... done: 对于传递给脚本的每个文件,执行以下循环体。

grep foobar "$file" > /dev/null 2> /dev/null: 在文件中查找字符串"foobar"。将 grep 命令的标准输出和标准错误输出都丢弃,不打印出来。dev/null 是一个特殊的设备文件,任何写入到 /dev/null 的数据都会被丢弃。> 符号只能重定向标准输出,而 2> 符号只能重定向标准错误输出。这样,通过检查前一个命令的退出状态码 $?,可以判断命令是否执行成功

if [[ "$?" -ne 0 ]]; then ... fi: 如果上一条命令的退出状态码($?)不等于0(即命令没有成功执行),则执行以下条件语句。

echo "File $file does not have any foobar, adding one": 打印文件没有找到字符串"foobar"的提示信息。

echo "# foobar" >> "$file": 在文件末尾添加一行字符串"# foobar"。

通过这段代码,你可以在给定的文件中查找"foobar",如果没有找到,则在文件中添加这个字符串。写完后保存退出。

此时如果直接像老师一样运行./example.sh mcd.sh foo.txt example.sh会提示“bash: ./example.sh: 权限不够”,如果使用sudo ./example.sh mcd.sh foo.txt example.sh则会提示“sudo: ./example.sh:找不到命令”。
因此这里需要添加一次执行权限。chmod +x example.sh如果不添加执行权限,则可以用前面说的source运行脚本,这里我写了个显示“hello”的test.sh测试了一下:

示例

example.sh mcd.sh foo.txt example.sh
example.sh:未找到命令

(base) ymd@WP:~/practise$ ./example.sh mcd.sh foo.txt example.sh
bash: ./example.sh: 权限不够

(base) ymd@WP:~/practise$ sudo ./example.sh mcd.sh foo.txt example.sh
[sudo] ymd 的密码: 
sudo: ./example.sh:找不到命令

(base) ymd@WP:~/practise$ chmod +x example.sh

(base) ymd@WP:~/practise$ ./example.sh mcd.sh foo.txt example.sh
Starting program at 2023年 12月 22日 星期五 17:47:35 CST
Running program ./example.sh with 3 arguments with pid 40657
File mcd.sh does not have any foobar,adding one
File foo.txt does not have any foobar,adding one

(base) ymd@WP:~/practise$ test.sh
test.sh:未找到命令
(base) ymd@WP:~/practise$ ./test.sh
bash: ./test.sh: 权限不够
(base) ymd@WP:~/practise$ source test.sh
hello

大括号{}和diff

大括号可以扩展输入的东西,比如输入touch {foo,bar}/{a..j},那么会扩展为touch foo/a foo/b……bar/i bar/j。
diff可以查看几个变量之间的不同之处

示例

(base) ymd@WP:~/practise$ touch {foo,bar}/{a..j}
(base) ymd@WP:~/practise$ ls {foo,bar}
bar:
a  b  c  d  e  f  g  h  i  j

foo:
a  b  c  d  e  f  g  h  i  j
(base) ymd@WP:~/practise$ touch foo/x bar/y
(base) ymd@WP:~/practise$ diff <(ls foo) <(ls bar)
11c11
< x
---
> y

find

该命令可以通过用户给定的表达式在指定目录下搜索文件,并执行指定的操作。
常用命令选项参数如下:

-name:按文件名查找文件
-type:按文件类型查找文件
-perm:按文件权限来查找文件
-prune:表示要忽略的目录
-depth:指定搜索顺序,从文件树的最子层目录查起
-user:查找属于指定用户名的所有文件
-group:查找属于指定用户组的所有文件
-size n:查找文件长度为n块的文件,默认每块512字节
-mtime -n/+n: 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
-atime:按照文件的访问时间来查找文件,使用与mtime相同。
-ctime: 按照文件的改变状态的时间来查找文件,使用与mtime相同。

作者:tigeriaf 链接:https://juejin.cn/post/7020600055958601742 来源:稀土掘金

示例

find . -name src -type d
find . -path '**/test/*.py' -type f
find . -mtime -1
find . -name "*.tmp" -exec rm {} \;

查找当前目录(及子目录)下名字为src的文件夹(d=dir)
查找当前目录(及子目录)下test文件夹里所有的py文件(f=file)
查找当前目录(及子目录)下修改日期为一天前的所以东西
查找当前目录(及子目录)下所有的tmp文件并执行rm {} \

杂七杂八

ls *.sh搜索所有sh文件
ls ?.sh搜索占一位的sh文件比如 1.sh,2.sh,过滤不是一位的sh比如搜不到22.sh
convert 命令主要用于图像格式的转换和处理。它支持将一种图像格式转换为另一种格式,如将 JPEG 转换为 PNG比如convert image.jpg image.png
shellcheck命令可以检查sh文件中可能存在的错误
tldr 显示命令的用法,比如tldr tar
history | grep vim 显示历史命令并查找其中包含vim字段的命令
ctrl+R 类似于word中的查找,再次摁ctrl+R相当于查找下一个
tree 以树形结构显示文件目录
broot 和tree作用相同,但是可以通过输入字母查找文件(没找到从哪下载broot,我试了一下tree | grep可以达到相同的效果)

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值