作为 Linux 系统用户,我们每天都要敲很多命令。不管是我们自己敲命令还是看别人敲命令,都会发现,这些命令中除了常见的字母及数字外,经常还有一些令人费解的特殊符号。
这些特殊符号对老司机而言早已轻车熟路了,但对于初学者来说常常弄得他们不知所措。本文就介绍 Linux 系统中常见的 15 种特殊符号,老用户就权当复习一下,新用户就赶紧来充电哦~
~ 主目录
符号 ~
位于按键 Esc
正下方,在 Linux 系统中它指的是家目录,或者主目录,也就是用户登录到系统的时候默认进入的目录。
此外,不管你此刻在系统中的哪个目录下,只要运行 cd ~
命令,就可以立即返回到家目录下。
$ cd ~
同时,它通常也会用作相对路径的起点,可以直接定位到家目录中的指定目录,这样移植性就更强了。
$ cd ~/work/archive
. 当前目录
符号 .
代表的是当前目录。在每个目录里,都会自动包含了两个目录:当前目录 .
和父目录 ..
。但是这两个目录都是隐藏起来的,如果想查看的话需要在 ls
命令后面加上 -a
选项。
$ ls -al
符号 .
更经常的用法是用在命令或其它可执行文件里,比如下面这样,表示执行当前目录下的 script.sh
脚本。
$ ./script.sh
这样执行脚本的意思是告诉 bash ,只需要执行当前目录下的 script.sh
脚本就可以,无需到其它目录去寻找这个脚本。
.. 父目录
符号 ..
表示父目录,也就是指当前目录的上一级目录。假如我们想要快速回退到上一级目录,可以直接执行下面命令:
$ cd ..
同样地,它也可以作为相对路径的起点,表示在从上级目录开始定位到具体的目录,这样可以少敲很多命令,同时便于移植。
$ cd ../projects/
/ 路径目录分隔符
符号 /
表示路径目录分隔符,也就是用于在路径里各个目录间的分隔,这个符号大家应该比较熟悉。
$ ls ~/work/tests/
但是,如果 /
在路径的最前面,又是什么意思呢?因为对于 Linux 系统,它的目录树是始于 /
的,所以仅仅一个 /
符号是代表我们常说的系统根目录。
$ cd /
# 注释
符号 #
表示,这行中 #
之后的内容是注释,不进行解析,会被 Shell 所忽略。
# This will be ignored by the Bash shell
虽然 #
之后的内容会被 Shell 所忽略,但它还是会被保留在历史记录里,你使用 history
命令查看的时候,依然会看到这句语句的。
当然 #
还有更高级的用法,现在举个例子。
首先,定义一个变量 this_string
,并给它赋值内容 amazing alvin
:
$ this_string="amazing alvin"
现在我们对变量 this_string
进行处理:${this_string#amazing}
,这样处理的结果是将 this_string
里的 amazing
这个单词注释掉,所以返回结果只剩下 alvin
,我们可以使用 echo
命令查看结果:
$ echo awsome ${this_string#amazing}
但是,这样处理并没有将 amazing
单词删除掉,它只是被注释掉而已,我们可以验证一下:
$ echo $this_string
amazing alvin
? 单字符通配符
符号 ?
表示的是单字符通配符,简单说可以用它来通配一个字符,例如:
$ ls badge?.txt
它可以匹配出来 badge 后跟一个字符的文件,但它无法匹配出 badge.txt ,因为 badge 后面没有跟字符。也就是说,在 ?
这个位置有且只能有一个字符。
如果你想找一个文件,但忘记这个文件的文件名了,只记得它有多少个字符,那么就可以使用对应多个 ?
字符去扫描这个文件,比如我记得某个文件是 5 个字符,那么就可以输入 5 个 ?
符号:
$ ls ?????.txt
虽然有点别扭,但这个方法还是相对比较高效的。
* 字符序列通配符
符号 *
表示任意字符通配符,它可以匹配 0 个至多个字符,还是以上面的 badge 为例:
$ ls badge*
从结果里可以看出来,文件 badge.txt
也被匹配到了,也就是说 badge 后面跟的是空字符的也可以被正常匹配。
如果你想找到任意类型的文件,可以直接将文件类型写成 *
就可以匹配到了。
$ ls source.*
[] 字符集通配符
方括号 []
代表字符集通配符,也就是说,文件名中的对应字符必须与 []
里的某个字符一样,才可以匹配成功。有点抽象,我们直接来看个例子吧:
$ ls badge_0[246].txt
这样可以匹配到 badge_02.txt 、badge_04.txt 、badge_06.txt ,但 badge_01.txt 就无法匹配到,因为 1 没有落在 [246] 里。
再举两个例子,大家可以体会一下。
$ ls badge_[01][789].txt
$ ls badge_[23][1-5].txt
; 命令分隔符
符号 ;
表示用来分隔命令的,当你想在同一行里写多条命令的时候,可以使用 ;
将这些命令隔开。
$ ls > count.txt; wc -l count.txt; rm count.txt
这里注意,用 ; 分隔命令时,即使第一个命令失败,第二个命令也会运行,即使第二个命令失败,第三个命令也会运行,依此类推。
如果你希望前一个命令执行失败之后,后面的命令都不执行了,那么就需要使用 &&
符号了,如下所示:
$ cd ./doesntexist && cp ~/Documents/reports/* .
& 后台处理
符号 &
表示后台执行。如果我们此时正在终端执行一个命令,比如说 vim
,但是与时同时我还想要执行另一个命令,怎么办?我们可以在 vim
命令后面加一个 &
符号,这样这个命令就会在后台执行了,你就可以执行另外的其它你想执行的命令了。
$ vim command_address.page &
结果里显示的 [1] 31105
就是 vim
所对应的进程号。
符号 表示输入重定向。很多 Linux 命令接受一个文件作为参数,并从该文件中获取数据。不仅仅是文件,实际上很多命令是可以从流中获取输入。使用符号
就可以创建一个流,将文件中的数据重定向到命令中:
$ sort
上面这条命令执行的结果是将 words.txt 文件里的几个单词进行了重新排序。
注意:在结果里文件名是不显示的,而有些命令会显示(例如 wc )。
$ wc words.txt
$ wc
> 输出重定向
符号 >
表示输出重定向。其实输入和输出刚好是相反的,可以将命令的结果重定向出来,一般是重定向到文件里。
$ ls > files.txt
$ cat files.txt
更高级的玩法是与数字一同使用:
$ wc doesntexist.txt 2> errors.txt
$ cat errors.txt
但这里的「数字」不是简单的数字,这里的 2 是一个文件描述符,表示标准错误(stderr)。相应地,还有 0 表示标准输入(stdin),1 表示标准输出(stdout)。
如果有感兴趣的话,可以去了解下文件描述符 stdin,stdout,stderr 的具体信息?
| 连接命令
符号 |
表示管道。它表示上一个命令命令的输出,通过管道作为下一个命令的输入。这样通过管道可以连接起多个命令,而且这些命令的数量是任意的。
$ cat words.txt | grep [cC] | sort -r
这里稍微解释一下,上面这条命令是将 cat
命令的结果( words.txt 文件的内容),通过管道输入到下一个命令 grep
,通过 grep
查找之后再将结果通过管道传递给 sort
命令,利用 sort -r
进行反射排序。
! 逻辑非
符号 !
表示逻辑非,与大多数编程语言中的 !
类型,我们直接来看个例子吧。
$ [ ! -d ./backup ] && mkdir ./backup
第一条命令表示测试是否不存在 backup 这个目录,其中 -d
表示判断的是目录,使用 !
表示不存在;
第二条命令表示创建 backup 目录文件;
而中间的 &&
前文已经解释过了,表示连接两条命令,但是第一条命令执行失败的话,第二条命令将不执行。
简而言之,这行命令的意思是如果 backup 目录不存在的话,就创建这个目录;反之,就不重复创建。
我们也可以再用 ls
命令看下上面那行命令的执行结果。
$ ls -l -d backup
符号 !
的另一个用法就是重复执行历史命令中的某个命令。
$ !24
$ !!
!!
表示重新运行上一条命令的意思。
$ 变量表达式
符号 $
通常表示取变量的值,比如下面是取一些系统变量的值:
$ echo $USER
$ echo $HOME
$ echo $PATH
当然,你也可以自己定义变量,然后使用 $
去取它的值:
$ ThisDistro=Ubuntu
$ MyNumber=2001
$ echo $ThisDistro
$ echo $MyNumber
如果我们再配合 {}
的话,就会解锁更多更高级的玩法,下面再举个例子。
首先定义一个变量 MyString ,然后再给它赋值 123456qwerty
$ MyString=123456qwerty
正常输出变量的值是这样的:
$ echo ${MyString}
如果想要从索引位置 6 开始到最后的字符串输出到屏幕,可以加个 :6
$ echo ${MyString:6}
如果想要从索引位置 0 开始起的 6 个字符输出到屏幕,可以加个 0:6
$ echo ${MyString:0:6}
同样地,如果想要从索引位置 4 开始起的 4 个字符输出到屏幕,可以加个 4:6
$ echo ${MyString:4:4}
引用特殊字符
上面提到的所有那些特殊字符,在通常情况下都是有特殊的用途的,但是如果我就是想让它们作为一般的符号显示,要怎么做呢?这种需求我们称之为引用,Linux 中有三种引用方法。
-
使用双引号 ""
括起来,但是这样对$
无效。
$ echo "Today is $(date)"
-
使用单引号 ''
括起来,停止所有特殊字符的功能。
$ echo 'Today is $(date)'
-
使用反斜杠 \
转义,这在很多场合都有通用的。
$ echo "Today is \$(date)"
今天的科普文章有点长,大家慢慢消化哈。