收藏 | 15 个你非了解不可的 Linux 特殊字符,妈妈再也不用担心我看不懂这些符号了!

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

收藏 | 15 个你非了解不可的 Linux 特殊字符,妈妈再也不用担心我看不懂这些符号了!

良许Linux   2020-03-30 我要评论
不知道大家接触 Linux 系统有多久了,可曾了解过 Linux 中有哪些特殊的字符呢?其实啊,那些特殊字符都大有用处呢,今天的文章就给大家简单地科普一下 Linux 中你需要了解的 15 个特殊字符,想学或刚学 Linux 的小伙伴赶紧上车了为! #### ~ 主目录 这个波浪号 **~** 指的是**主目录**,也就是我们用户的个人目录,无论你身在何方,输入 `cd ~` 它将带你回家! ``` cd ~ ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220708217-737530038.jpg) 更高端的玩法就是在它后面加上具体的路径,直接定位到家目录中的指定位置,是不是很方便呢? ``` cd ~/work/archive ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220708577-1247541237.jpg) #### . 当前目录 英文句号 **.** 代表**当前目录**,我们来看一下当前目录下的全部文件: ``` ls -al ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220709243-924030994.jpg) 红圈里的 **.** 就是指当前目录,不过这没什么意义,我们更多的是在命令中使用它,如下: ``` ./script.sh ``` 这样做是在告诉 bash 只要在当前目录中查找并执行 `script.sh` 文件就好了,不用在路径中找了。 ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220709595-906369324.jpg) #### .. 父目录 两个英文句号 **..** 代表**父目录**,也就是当前目录的上一级目录。假设我们要回到上一级目录: ``` cd .. ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220709903-1501869661.jpg) 跟前面一样,你可以在它后面加具体的目录,这里的意思就是定位到与当前目录同级的其它目录: ``` cd ../projects/ ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220710265-683895726.jpg) #### / 路径目录分隔符 斜杠 **"/"** 指的是**路径目录分隔符**,这里没什么好说的。 ``` ls ~/work/tests/ ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220710603-1007468975.jpg) 但是,有意思的是,如果 **/** 路径目录分隔符前面没有东西的话,是不是就是意味着这是最上级的目录了?由于 Linux 系统的目录树均始于 **/** ,所以仅仅一个 **/** 代表了我们常说的**系统根目录**。 ``` cd / ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220710958-1086665605.jpg) #### # 注释 以 **#** 开头,代表这句话是**注释**。 ``` # This will be ignored by the Bash shell ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220711298-1808825340.jpg) 虽然上面那段话就被忽略了,但它还是会添加到您的命令历史记录中。 更厉害的做法如下: 先定义一个变量并给它赋值字符串 **“amazing alvin”** ``` this_string="amazing alvin" ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220711574-407477763.jpg) **${this_string#amazing}** 返回的是**被注释掉 amazing 的 this_string 字符串变量**,可以 echo 输出看下结果: ``` echo awsome ${this_string#amazing} ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220711883-1222063529.jpg) amazing 只是被注释掉而已,它并未被删除,去掉注释它就回来了: ``` echo $this_string ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220712157-146066652.jpg) #### ? 单字符通配符 问号 **"?"**,指的是**单字符通配符**。*Bash Shell 支持三种通配符*。 它代表文件名中**任意一个字符**的匹配,例如: ``` ls badge?.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220712563-151489780.jpg) 注意,它与 **badge.txt** 是不匹配滴,因为 badge 后面没有字符。 正因为 **"?"** 匹配单个字符,所以这里有个看似很厉害的玩法,就是你想要的找的文件的文件名有多少个字符,你就输入多少个 **"?"** 。 ``` ls ?????.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220712848-616112807.jpg) 看着挺厉害,不过我怎么感觉这好别扭????? #### * 字符序列通配符 星号 **\*** 代表的是**任意字符序列**,**匹配任意字符,包括空字符**,以刚才的 badge 为例: ``` ls badge* ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220713179-687896496.jpg) 可以看到,**badge.txt** 都匹配到了。 匹配任意类型的文件: ``` ls source.* ``` #### [] 字符集通配符 方括号 **"[]"** 指的是**字符集通配符**,文件名中的相关字符必须与字符集中的至少一个字符匹配。通过例子来体会一下它的作用吧: ``` ls badge_0[246].txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220713434-1862654436.jpg) ``` ls badge_[01][789].txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220713692-1267193313.jpg) ``` ls badge_[23][1-5].txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220714019-1904996738.jpg) #### ; 命令分隔符 这跟我们日常使用的 **";"** 差不多,就不细说了,主要是用来**分隔命令**的。 ``` ls > count.txt; wc -l count.txt; rm count.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220714393-712935395.jpg) **这里注意,用 ; 分隔命令时,即使第一个命令失败,第二个命令也会运行,即使第二个命令失败,第三个命令也会运行,依此类推。** 如果要在一个命令失败的情况下就停止,请使用 **"&&"** ,如下: ``` cd .https://img.qb5200.com/download-x/doesntexist && cp ~/Documents/reports/* . ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220714672-1386292958.jpg) #### & 后台处理 有时候在终端正在运行一个命令时,例如 vim,你想运行另外一个命令怎么办?这里有个小技巧就是在命令后面加一个 **"&"** 符号,将这个程序放在后台启动,这样你就能在终端实现后台多任务的效果了。 ``` vim command_address.page & ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220714960-575563572.jpg) 上面显示的是这个后台进程的 ID 。 #### < 输入重定向 许多 Linux 命令接受一个文件作为参数,并从该文件中获取数据。这些命令中的大多数还可以从流中获取输入。要创建一个流,可以使用左尖括号 **"<"** ,如下将文件重定向到命令中: ``` sort < words.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220715173-350922345.jpg) 上面将 words.txt 文件的内容并进行了排序。 **注意:它是不显示数据来源文件的文件名的。** ``` wc words.txt ``` ``` wc < words.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220715476-141387503.jpg) #### > 输出重定向 输入和输出是相反的,很好理解。用右尖括号 **">"** 将命令的输出重定向,**通常是重定向到文件中**。 ``` ls > files.txt ``` ``` cat files.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220715802-1412898397.jpg) 高端玩家还可以和数字一同使用: ``` wc doesntexist.txt 2> errors.txt ``` ``` cat errors.txt ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220716255-454901142.jpg) **这里的 2 是一个文件描述符,表示标准错误(stderr)** *大家感兴趣的可以去搜索下文件描述符 stdin,stdout,stderr 是什么?* #### | 连接命令 我们可以将 **" | "** 看成将命令链接在一起的管道。它从一个命令获取输出,并将其作为输入送入下一个命令。管道命令的数量是任意的。 ``` cat words.txt | grep [cC] | sort -r ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220716489-1760976861.jpg) 解释下,上面先使用 cat 将 words.txt 文件的内容输入 grep , 然后 grep 提取包含小写或大写(C/c)的任何行,接着 grep 将这些行传递给 sort ,最后 sort 进行 -r 反向排序。 #### ! 逻辑非 这跟编程语言中的 **" ! "** 差不多,我们直接拿个例子来说吧: ``` [ ! -d ./backup ] && mkdir ./backup ``` 第一个命令 **-d** 判断当前目录是否存在 backup 的目录文件,外面加个逻辑非 **!** 判断, 第二个命令是创建 backup 目录文件, 中间的 **&&** 上面说过。 总的来说就是当 backup 目录不存在时,创建 backup 目录;当不存在时则不执行第二条命令。 不妨看下文件夹的备份状态: ``` ls -l -d backup ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220716874-2082676760.jpg) **" ! "** 的另一个用法就是重新运行历史命令: ``` !24 ``` ``` !! ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220717241-1939332886.jpg) **" !! "** 是重新运行上一条命令的意思。 #### $ 变量表达式 **"$"** 开头通常表示变量,下面是一些系统变量: ``` echo $USER ``` ``` echo $HOME ``` ``` echo $PATH ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220717564-109537820.jpg) 当然,你也可以自己定义变量然后输出: ``` ThisDistro=Ubuntu ``` ``` MyNumber=2001 ``` ``` echo $ThisDistro ``` ``` echo $MyNumber ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220717935-781623301.jpg) 我们还可以通过 **"{}"** 解锁更高级的玩法: 先定义一个变量 MyString 并给它赋值 123456qwerty ``` MyString=123456qwerty ``` 正常输出 ``` echo ${MyString} ``` 加个 **":6"** 返回从索引位置 6 开始的一直到最后的字符串 ``` echo ${MyString:6} ``` 显示从索引位置从 0 开始往后 6 个字符的字符串 ``` echo ${MyString:0:6} ``` 显示从索引位置从 4 开始往后 4 个字符的字符串 ``` echo ${MyString:4:4} ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220718291-172108927.jpg) #### 引用特殊字符 说了那么多,那么就有个问题了,就是我只想在命令里面将这些特殊字符作为一般的符号显示怎么办?这种我们称之为引用,Linux 中有三种引用方法。 用双引号 **""** 括起来,不过这对 **"$"** 无效。 ``` echo "Today is $(date)" ``` 用单引号 **''** 括起来,**停止所有特殊字符的功能**。 ``` echo 'Today is $(date)' ``` 反斜杠 **\\** 转义,这在很多场合都有通用的。 ``` echo "Today is \$(date)" ``` ![](https://img2020.cnblogs.com/other/1218435/202003/1218435-20200330220718656-1367763864.jpg) 今天的科普文章有点长,大家慢慢消化哈。 #### 看完的都是真爱,点个赞再走呗?您的「三连」就是良许持续创作的最大动力! 1. 关注**原创**公众号「**良许Linux**」,第一时间获取最新Linux干货! 2. 公众号后台回复【资料】【面试】【简历】获取精选一线大厂面试、自我提升、简历等资料。 3. 关注我的博客:[lxlinux.net](http://www.lxlinux.net)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们