Bash 基础知识

已完成

若要了解 Bash,首先要了解 Bash 语法。 了解语法后,可以将其应用到你运行的每个 Bash 命令。

Bash 命令的完整语法如下:

command [options] [arguments]

Bash 将其遇到的第一个字符串视为命令。 以下命令使用 Bash 的 ls(表示“list”)命令显示当前工作目录的内容:

ls

Bash 命令通常带有参数。 例如,可以在 ls 命令中添加路径名称,以列出其他目录的内容:

ls /etc

大多数 Bash 命令都具有用于修改其工作方式的选项。 选项(也称为标志)为命令传达更具体的指令。 例如,名称以句点开头的文件和目录会对用户隐藏,而不会由 ls 显示。 但可以在 ls 命令中添加 -a(表示“all”)标志,以便查看目标目录中的所有内容:

ls -a /etc

甚至可以为了简洁合并标志。 例如,与其输入 ls -a -l /etc 以长格式显示 Linux 的 /etc 目录中的所有文件和目录,不如输入以下内容

ls -al /etc

Bash 非常简洁。 有时使用一个命令即可完成大量任务(这是 Bash 爱好者引以为豪之处)。

获取帮助

可以使用或必须使用的选项和参数因命令而异。 幸运的是,Bash 文档内置到了操作系统中。 只需要使用一个命令即可获得所需帮助。 若要了解命令的选项,请使用 man(表示“manual”)命令。 例如,若要查看 mkdir(表示“make directory”)命令的所有选项,请执行以下操作:

man mkdir

man 有助于你了解 Bash。 man 可用于获取了解命令工作方式所需的信息。

大多数 Bash 和 Linux 命令都支持 --help 选项。 这会显示命令的语法和选项的说明。 为进行演示,请输入 mkdir --help。 输出将如下所示:

Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.
    
Mandatory arguments to long options are mandatory for short options too.
  -m, --mode=MODE   set file mode (as in chmod), not a=rwx - umask
  -p, --parents     no error if existing, make parent directories as needed
  -v, --verbose     print a message for each created directory
  -Z                   set SELinux security context of each created directory
                         to the default type
      --context[=CTX]  like -Z, or if CTX is specified then set the SELinux
                         or SMACK security context to CTX
      --help     display this help and exit
      --version  output version information and exit
    
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report mkdir translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/mkdir>
or available locally via: info '(coreutils) mkdir invocation'

以这种方式获取的帮助通常比使用 man 获取的帮助更简洁。

使用通配符

通配符是表示 Bash 命令中的一个或多个字符的符号。 最常用的通配符是星号。 它表示无字符或字符序列。 假设当前目录中包含数百个图像文件,但你只想查看文件名以 .png 结尾的 PNG 文件。 以下命令仅列出上述文件:

ls *.png

注意

与其他操作系统不同,Linux 对于文件扩展名并没有正式概念。 这不表示 PNG 文件没有 .png 扩展名。 这只是表示 Linux 不会对文件名以 .png 结尾这一点附加任何特殊意义

现在,假设当前目录中还包含 JPEG 文件。 有些以 .jpg 结尾,而另一些以 .jpeg 结尾。以下是列出所有 JPEG 文件的一种方法

ls *.jpg *.jpeg

以下是另一种方法:

ls *.jp*g

* 通配符与零字符或多字符匹配,但 ? 通配符表示单字符。 如果当前目录中包含名为 0001.jpg、0002.jpg 以此类推到 0009.jpg 的文件,以下命令会将其全部列出

ls 000?.jpg

但使用通配符筛选输出的另一种方法是使用表示字符组的方括号。 以下命令会列出当前目录中名称包含句点且句点后跟小写 J 或 P 的所有文件。该命令会列出所有 .jpg、.jpeg 和 .png 文件,但不会列出 .gif 文件

ls *.[jp]*

在 Linux 中,文件名和对文件名进行操作的命令区分大小写。 因此,若要列出当前目录中名称包含句点且句点后跟大写或小写 J 或 P 的所有文件,可以输入以下内容

ls *.[jpJP]*

方括号中的表达式可以表示字符范围。 例如,以下命令会列出当前目录中名称以小写字母开头的所有文件:

ls [a-z]*

相反,以下命令会列出当前目录中名称以大写字母开头的所有文件:

ls [A-Z]*

以下命令则会列出当前目录中名称以大写字母或小写字母开头的所有文件

ls [a-zA-Z]*

基于如上所述,你是否能猜出以下命令的作用?

ls [0-9]*
ls *[0-9]*
ls *[0-9]

如果需要将某个通配符用作普通字符,可以在该字符前加上一个反斜杠,使其成为文本或将其“转义”。 因此,如果由于某种原因在文件名中使用了星号(不应故意执行此操作),可以使用如下命令进行搜索:

$ ls *\**