从 shell 眼中看世界
(字符) 展开
每一次你输入一个命令,然后按下 enter 键,在 bash 执行你的命令之前, bash 会对输入的
字符完成几个步骤处理。我们已经知道两三个案例,怎样一个简单的字符序列,例如 “*”, 对
shell 来说,有很多的涵义。使这个发生的过程叫做(字符)展开。通过展开,你输入的字符,
在 shell 对它起作用之前,会展开成为别的字符。为了说明我们所要表达的意思,让我们看一
看 echo 命令。echo 是一个 shell 内部命令,来完成非常简单的认为。它在标准输出中打印出它
的文本参数。
那么刚才发生了什么事情呢?为什么 echo 不打印 “*” 呢?随着你回想起我们所学过的关于
通配符的内容,这个 “*” 字符意味着匹配文件名中的任意字符,但是在原先的讨论中我们却不
知道 shell 是怎样实现这个功能的。最简单的答案就是 shell 把 “*” 展开成了另外的东西(在这
种情况下,就是在当前工作目录下的文件名字),在 echo 命令被执行前。当回车键被按下时,
shell 在命令被执行前在命令行上自动展开任何符合条件的字符,所以 echo 命令从不会发现
“*”, 只把它展开成结果。知道了这个以后,我们能看到 echo 执行的结果和我们想象的一样。
路径名展开
这种通配符工作机制叫做路径名展开。如果我们试一下在之前的章节中使用的技巧,我们
会看到它们真是要展开的字符。给出一个主目录,它看起来像这样:
查看主目录之外的目录:
隐藏文件路径名展开
正如我们知道的,以圆点字符开头的文件名是隐藏文件。路径名展开也尊重这
种行为。像这样的展开:
echo *
不会显示隐藏文件
要是展开模式以一个圆点开头,我们就能够在展开模式中包含隐藏文件,而且
隐藏文件可能会出现在第一位置,就像这样:
echo .*
它几乎是起作用了。然而,如果我们仔细检查一下输出结果,我们会看到名字
“.” 和 “..” 也出现在结果中。因为这些名字是指当前工作目录和它的父目录,使用这
种模式可能会产生不正确的结果。我们能看到这样的结果,如果我们试一下这个命
令:
ls -d .* | less
为了在这种情况下正确地完成路径名展开,我们应该雇佣一个更精确些的模式。
这个模式会正确地工作:
ls -d .[!.]?*
这种模式展开成为文件名,每个文件名以圆点开头,第二个字符不包含圆点,
再包含至少一个字符,并且这个字符之后紧接着任意多个字符。这将列出大多数的
隐藏文件(但仍将不能包含以多个圆点开头的文件名)这个带有 -A 选项(“几乎所
有”)的 ls 命令能够提供一份正确的隐藏文件清单:
ls -A
正则表达式的东西在之后的随笔讲解。
波浪线展开
可能你从我们对 cd 命令的介绍中回想起来,波浪线字符 (“∼”) 有特殊的意思。当它用在一
个单词的开头时,它会展开成指定用户的主目录名,如果没有指定用户名,则是当前用户的主
目录:
算术表达式展开
shell 允许算术表达式通过展开来执行。这允许我们把 shell 提示当作计算器来使用:
(以上括号中的)表达式是指算术表达式,它由数值和算术操作符组成。
算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作。这里是
一些它支持的操作符:
花括号展开
可能最奇怪的展开是花括号展开。通过它,你可以从一个包含花括号的模式中创建多个文
本字符串。这是一个例子:
花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式
本身可能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。这种模式
可能不包括嵌入的空白。这个例题使用了一系列整数:
那么这对什么有好处呢?最普遍的应用是,创建一系列的文件或目录列表。例如,如果我
们是摄影师,有大量的相片。我们想把这些相片按年月先后组织起来。首先,我们要创建一系
列以数值 “年-月” 形式命名的目录。通过这种方式,目录名按照年代顺序排列。我们可以键
入整个目录列表,但是工作量太大了,并且易于出错。反而,我们可以这样做:
参数展开
在这一章我们将会简单地介绍参数展开,只是皮毛而已。后续章节我们会广泛地讨论参数
展开。这个特性在 shell 脚本中比直接在命令行中更有用。它的许多性能和系统存储小块数据,
并给每块数据命名的能力有关系。许多像这样的小块数据,更适当些应叫做变量,可以方便地
检查它们。例如,叫做 “USER” 的变量包含你的用户名。唤醒参数展开,揭示 USER 中的内
容,可以这样做:
命令替换
命令替换允许我们把一个命令的输出作为一个展开模式来使用:
这里我们把 which cp 的执行结果作为一个参数传递给 ls 命令,因此要想得到 cp 程序的输
出列表,不必知道它完整的路径名。我们不只限制于简单命令。也可以使用整个管道线(只展
示部分输出):
引用
我们已经知道 shell 有许多方式可以完成展开,现在是时候学习怎样来控制展开了。以下面
例子来说明:
双引号
我们将要看一下引用的第一种类型,双引号。如果你把文本放在双引号中, shell 使用的特
殊字符,除了 $, \ (反斜杠),和 ‘(倒引号)之外,则失去它们的特殊含义,被当作普通字符
来看待。这意味着单词分割,路径名展开,波浪线展开,和花括号展开都被禁止,然而参数展
开,算术展开,和命令替换仍然执行。使用双引号,我们可以处理包含空格的文件名。比方说
我们是不幸的名为 two words.txt 文件的受害者。如果我们试图在命令行中使用这个文件,单词
分割机制会导致这个文件名被看作两个独自的参数,而不是所期望的单个参数:
单词分割被禁止,内嵌的空格也不会被当作界定符,它们成为参数的一部分。一旦加上双引号,我们的命令行就包含一个带有一个参数的命令。
事实上,单词分割机制把换行符看作界定符,对命令替换产生了一个,虽然微妙,但有趣的影响。考虑下面的例子:
单引号
如果需要禁止所有的展开,我们使用单引号。以下例子是无引用,双引号,和单引号的比
较结果:
转义字符
有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这个上下文中叫
做转义字符。经常在双引号中使用转义字符,来有选择地阻止展开。
为了允许反斜杠字符出现,输入 “\” 来转义。注意在单引号中,反斜杠失去它的特殊含义,它被看作普通字符。
echo 命令带上 “-e” 选项,能够解释转义序列。你可以把转义序列放在 $ ’ ‘ 里
面。以下例子,使用 sleep 命令,一个简单的程序,它会等待指定的秒数,然后退
出。我们可以创建一个简单的倒数计数器:
sleep 10; echo -e “Time’s up\a”
我们也可以这样做:
sleep 10; echo “Time’s up” $’\a’
从 shell 眼中看世界的更多相关文章
- (六)linux 学习 -- 从 shell 眼中看世界
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap08.html 文章目录 字符展开 `*` 路 ...
- 从Shell眼中看世界【TLCL】
字符展开: echo * 路径名展开: echo D* 隐藏文件路径名展开 ls -d .[!.]?* 波浪线展开: echo ~ 算术表达式展开: $((expression)) 花括号展开: ...
- 从vultr购买到搭ss看世界
title: 从Vultr购买到搭ss看世界 date: 2017-11-19 12:28:38 categories: 技术 tags: top: 800 password: 写在前面 服务器提 ...
- CNN眼中的世界:利用Keras解释CNN的滤波器
转载自:https://keras-cn.readthedocs.io/en/latest/legacy/blog/cnn_see_world/ 文章信息 本文地址:http://blog.keras ...
- 生产力工具:shell 与 Bash 脚本
生产力工具:shell 与 Bash 脚本 作者:吴甜甜 个人博客网站: wutiantian.github.io 注意:本文只是我个人总结的学习笔记,不适合0基础人士观看. 参考内容: 王顶老师 l ...
- 学习 shell脚本之前的基础知识
转载自:http://www.92csz.com/study/linux/12.htm 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...
- linux 的基本操作(编写shell 脚本)
终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要.下面笔者就带你正式进入shell脚本的世界吧. 到现 ...
- linux的基本操作(shell 脚本的基础知识)
shell 脚本的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本 ...
- 学习shell脚本之前的基础知识
日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...
随机推荐
- apache的mod_proxy 反向代理
在某台机器上(跑着apache)为某个域名(如www.selboo.com.cn)做反向代理正好知道apache有mod_proxy这个 东东于是看了看文档写下了如下的配置文件: <Virtua ...
- Eclipse自动部署项目到Tomcat的webapps下的有效方法
开发JavaEE项目,常用的工具有MyEclipse,Eclipse,netBeans等,我比较喜欢用Eclipse,因为相比MyEclipse体积小很多,响应速度也快,且足以满足需求,我喜欢简洁的编 ...
- mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1'
源码安装的mysql数据库,在执行mysqldump的时候报错: # mysqldump -u root -p --all-databases > dbdump.db Enter passwor ...
- com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 > 1024)
### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 > 1024). You ...
- NTC与PTC压敏电阻在电源电路中起的作用
https://wenku.baidu.com/view/e39beafdfab069dc502201f9.html 压敏电阻的作用 http://www.eepw.com.cn/article/27 ...
- [转]Tomcat中的Session小结
阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟 ...
- SNF微信公众号客户端演示-微信开发客户端能干什么
关注测试微信号: 关注后菜单页面如下: 一.扫描二维码进行订单查询演示 1.点击菜单“软件产品”->选择“扫描查询” 2.扫描如下二维码进行订单查询演示. 3.扫描结果如下: 二.微信“输入订单 ...
- 解决Myeclipse中导入自定义的配色方案后,JSP中的js代码块为白色背景的问题
捣鼓了大半个上午,终于搞定.这样设置就可以了: 点击MyEclipse上方的菜单栏中的window菜单.选择Preferences菜单项.在弹出的窗口的左侧树形菜单依次选择:MyEclipse.Fil ...
- 安装ganglia过程中出现错误 perl(RRDp) is needed by rrdtool-1.2.30-1.el5.rf.x86_64
用rpm -ivh *.rpm安装ganglia的rpm包,然后出现下面的错误: warning: rrdtool-1.2.30-1.el5.rf.x86_64.rpm: Header V3 DSA/ ...
- 稀疏傅里叶变换(sparse FFT)
作者:桂. 时间:2018-01-06 14:00:25 链接:http://www.cnblogs.com/xingshansi/p/8214122.html 前言 对于数字接收来讲,射频域随着带 ...