07-2 引用
二、引用(控制扩展)
现在我们已经知道,shell 有多种方式可以进行扩展,现在我们来学习如何控制扩展。
echo this is a test
echo The tota is $100.00
第1个例子中,shell 会对 echo 命令的参数列表进行单词分割,去除多余空白; 第2个例子中,因为
1 的值替换为空字符串。
shell 提供了一种称为 引用 的机制,用来有选择性地避免不想要的扩展。
1.双引号
若把文本放在双引号中,那么 shell 使用的所有特殊字符(除美元符号 “ $ ” 、反斜杠 " "、反引号 “ ` ”)都将失去它们的特殊含义,而被看成普通的字符。 这也就意味着,单词分割、路径名扩展、波浪线扩展、花括号扩展都将失效,但是参数扩展、算术扩展、命令替换仍然生效。
(1)处理空白
使用双引号,能够处理文件名中包含空白的情况。
示例
假设有一个名为 one word.txt 的文件,若在命令行中使用该文件名,单词分割功能将把它当成两个独立的参数,而不是当成我们所希望的一个参数,运行如下:
ls -l one word.txt
# 这样,会因 单词分割功能 将 one word.txt 看成两个单词。
ls -l "one word.txt"
# 使用双引号,会自动处理文件名包含空白的情况,如我所愿看成一个参数。
使用双引号可以阻止单词分割,得到预期的结果。
(2)修复破损文件名
mv "one word.txt" one_word.txt
# mv将文件移动或文件重命名操作,原来的文件名将不再存在。
# 将 one word.txt 移动(或重命名)为 one_word.txt。
通过文件移动(或者说文件重命名),使得我们不需要一直输入那些令人讨厌的双引号了。
(3)参数、算术扩展和命令替换仍有效
① 切记:
所有特殊字符,除美元符号 “ $ ” 、反斜杠 " "、反引号 “ ` ” 以外都将失去它们的特殊含义,而被看成普通的字符。 参数扩展、算术扩展和命令替换仍然有效。
示例
echo "$USER $(( (5**2) * 2 )) $(cal)"
(4)对字符替换影响
在了解双引号对字符替换的影响之前,首先深入了解一下单词分割是怎么工作的。 在之前的例子中,单词分割会去除文本中多余空白。
echo this is a test
# 不加双引号,该命令行会被看成 echo 命令后跟着 4 个参数。
① 单词分割
默认情况下,单词分割会先查找是否存在空格、制表符以及换行字符,然后把它们当作单词间的界定符。 这就意味着,没有用引号包含起来的空格、制表符、换行字符都不会被当成文本的一部分,而只是被当成分割符。 因为单词分割会把 this is a test 分割成不同的参数,所以上面那个例子中的命令行会被识别成命令后面跟着 4 个不同的参数。但是如果加上双引号,单词分割功能将会失效,嵌入的空格将不再作为界定符,而是被当成参数的一部分,如下所示:
echo "this is a test"
# 加上双引号,该命令行会被看成 echo 命令后跟着 1 个参数,this is a test连同空格是一个整体,是1个参数。
② 换行字符在命令替换中的细微差别
单词分割机制会将换行字符当成界定符,这一点在命令替换时将会产生微妙有趣的效果。
echo $(cal)
echo "$(cal)"
第1个例子中,没有加上引号的命令替换将导致命令行被识别为命令后面跟着 38 个参数; 第2个例子中,加上双引号,使得命令行被识别为命令后面跟着 1 个参数,这个参数包含着嵌入的空格和换行字符。
2.单引号
如果我们希望抑制所有的扩展,那么应使用单引号。 下面是不使用引号、使用双引号和使用单引号的情况对比:
echo text ~/*.txt {a,b} $(echo foo) $(( 2+2 )) $USER
echo "text ~/*.txt {a,b} $(echo foo) $(( 2+2 )) $USER"
echo 'text ~/*.txt {a,b} $(echo foo) $(( 2+2 )) $USER'
随着引用级别的加强,越来越多的扩展将被抑制。
3.转义字符
有时,只是想要引用单个字符。 这种情况可以通过在该字符前加上反斜杠来实现。这里的反斜杠称为转义字符。 转义字符经常在双引号中用来有选择性地阻止扩展。如下所示:
echo "The balance for user $USER is:$5.00"
# 若不加 ,$5 会被认为是一个参数扩展。
转义字符也常用来消除文件名中某个字符的特殊含义。 比如,文件名中可以使用在 shell 中通常具有特殊含义的字符。这些字符包括 “ $ ”、“ ! ”、" & "、空格等。要想在文件名中包含特殊字符,可执行如下操作:
mv bad&filename good_filename
如果想要显示反斜杠字符,可以通过使用两个反斜杠“ ”来实现。 需要注意的是,单引号中的反斜杠将失去它的特殊含义,而只是被当成一个普通字符。
- Case When ELSE END语句
- oracle 表空间tablespace
- Oracle Schema
- Oracle 索引
- Oracle dbms_random随机函数包
- volatile和Synchronized区别
- Oracle 快速插入1000万条数据的实现方式
- HashMap实现原理分析
- Oracle TM锁和TX锁
- Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)
- select for update和select for update wait和select for update nowait的区别
- Android入门之动画
- Java 读写大文本文件
- 高级聚类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Tomcat NIO(9)-IO线程-Overall流程和关键类
- 有限元平面四边形等差单元python编程
- 动图演示:手撸堆栈的两种实现方法!
- [Go] 实战项目在线客服GO-FLY -在gin框架使用IP识别库转换IP为城市
- leetcode1552题解【二分+贪心】
- 这三年被分布式坑惨了,曝光十大坑
- 为什么删数据也提示空间不足呢?
- 前端踩坑系列《六》——让人又爱又恨的npm包
- docker运行Tomcat后访问首页报404(详细永久解决步骤)
- vue.js如何快速入门第1篇
- 3.列表-HTML基础
- 启动时间的一些分析
- 1.HTML基础知识-HTML进阶
- 浅析一个postgresql的死锁问题
- 你的第一个React App (二 ) - 应用组件开发