Shell工具和脚本概述

Shell脚本

  • 在bash中为变量赋值的语句是foo=bar,其中不能包含空格,否则会造成解析上的错误。
  • bash中的字符串通过 ‘ 以及 ” 进行定义。其中 ‘ 为原义字符串,其中的变量不会被转义。” 为转义字符串。
  • bash使用了很多特殊的变量来表示参数,错误代码和相关变量。完整的变量表
  • 退出码可以搭配 &&(与运算符)和 || (或运算符)来使用。
  • 对相似名称的文件进行处理时,可以使用通配符。可以使用 ? 和 * 来匹配任意一个字符比如对文件foo,foo1,foo2,foo10和bar,执行rm foo?会删除foo1和foo2,而rm foo*会删除除了bar之外的所有文件。
  • 当有一系列的指令,其中包含一段公共字符串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便
convert image.{png,jpg}
# 会展开为 convert image.png image.jpg cp 
/path/to/project/{foo,bar,baz}.sh /newpath 
# 会展开为 cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath
# 也可以结合通配使用 mv *{.py,.sh} folder 
# 会移动所有 *.py 和 *.sh 文件 mkdir foo bar 
# 下面命令会创建foo/a, foo/b, ... foo/h, bar/a, bar/b, ... bar/h这些文件 
touch {foo,bar}/{a..h} touch foo/x bar/y 
# 比较文件夹 foo 和 bar 中包含文件的不同 
diff <(ls foo) <(ls bar) 
# 输出 
# < x 
# --- 
# > y

Shell工具

查看命令如何使用

可以直接使用 -h 或者 man 程序。

有时候手册内容太过详实,让我们难以在其中查找哪些最常用的标记和语法。 TLDR pages 是一个很不错的替代品,它提供了一些案例,可以帮助您快速找到正确的选项。

查找文件

所有的类UNIX系统都包含一个名为 find 的工具,find 命令会通过递归的方式搜索符合条件的文件。例如

# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size  +500k -size -10M -name '*.tar.gz'

除了列出所寻找的文件之外,find还能对所有查找到的文件进行操作。这能极大地简化一些单调的任务。

# 删除全部拓展名为.tmp的文件
find . -name '*.tmp' -exec rm {} \;
# 查找全部的 PNG 文件并转换为 JPG
find . -name '*.PNG' -exec convert {} {}.jpg \;

同时,我们还可以寻找更加简便的程序,比如说fd,locate来查找

查找Shell命令

history 命令允许您以程序员的方式来访问shell中输入的历史命令。这个命令会在标准输出中打印shell中的里面命令。如果我们要搜索历史记录,则可以利用管道将输出结果传递给 grep 进行模式搜索。 history | grep find 会打印包含find子串的命令。、

对于大多数的shell来说,您可以使用 Ctrl+R 对命令历史记录进行回溯搜索。敲 Ctrl+R 后您可以输入子串来进行匹配,查找历史命令行。

Ctrl+R 可以配合 fzf 使用。fzf 是一个通用对模糊查找工具,它可以和很多命令一起使用。这里我们可以对历史命令进行模糊查找并将结果以赏心悦目的格式输出。

查找代码

查找文件是很有用的技能,但是很多时候您的目标其实是查看文件的内容。一个最常见的场景是您希望查找具有某种模式的全部文件,并找它们的位置。

为了实现这一点,很多类UNIX的系统都提供了grep命令,它是用于对输入文本进行匹配的通用工具。

grep 有很多选项,这也使它成为一个非常全能的工具。我将在后续的文章中探讨这个程序的使用方法。

同样,grep也有很多的替代品,包括ack, agrg

文件夹导航

目的是为了高效的在目录之间随意的切换。

要实现它有很多的方法,比如设置alias,使用 ln -s 创建符号连接等。而开发者们已经想到了很多更为精妙的解决方案。

我们可以使用fasdautojump 这两个工具来查找最常用或最近使用的文件和目录。

Fasd基于 frecency 对文件和文件排序,默认情况下,fasd使用命令 z 帮助我们快速切换到最常访问的目录。例如, 如果您经常访问/home/user/files/cool_project 目录,那么可以直接使用 z cool 跳转到该目录。对于 autojump,则使用j cool代替即可。

还有一些更复杂的工具可以用来概览目录结构,例如 tree, broot 或更加完整的文件管理器,例如 nnnranger

上一篇
下一篇