良许Linux教程网 干货合集 Linux系统下常见的非掌握不可的15个特殊字符

Linux系统下常见的非掌握不可的15个特殊字符

作为 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 中有三种引用方法。

  1. 使用双引号 "" 括起来,但是这样对 $ 无效。
echo "Today is $(date)"
  1. 使用单引号 '' 括起来,停止所有特殊字符的功能
echo 'Today is $(date)'
  1. 使用反斜杠 \ 转义,这在很多场合都有通用的。
echo "Today is \$(date)"

今天的科普文章有点长,大家慢慢消化哈。

本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
头像

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部