这节课主要讲了各种查找,后半程有一些命令达不到老师说的效果,我没听懂就没记,不过我觉得作为初学者来说这些也足够了
自定义字符串
在终端我们可以定义自己的字符串,定义方式类似于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
可以达到相同的效果)