热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shell脚本编程之引用

四种引用符shell中字符分为两种,一种是普通字符,另一种是元字符(meta)。元字符是shell的保留字符,在shell中有着特殊的意义。引

四种引用符

shell 中字符分为两种,一种是普通字符,另一种是元字符(meta)。元字符是 shell 的保留字符,在 shell 中有着特殊的意义。引用是指将字符串用某种符号括起来,以防止特殊字符被解析成其它意思。shell 中有四种引用符,用双引号,单引号,反引号和转义字符。

转义字符 \

特殊字符无法直接输出,因为特殊字符会被解析成其特殊意义。比如要打印美元符号 $

[ljx@localhost ~]$ echo $17
7
[ljx@localhost ~]$ echo \$17
$17

第一条命令,$ 符号被解析成取变量的值,$1 取的是脚本的第一个参数,因为这里并没有执行脚本,所以 $1 的值为空,最后输出的结果是7。正确的写法是第二条命令,使用转义字符 \ 来使特殊字符显示为字符本身。
除了 $ 符号,双引号、单引号,反引号,星号,百分号,问号,感叹号,分号,转义符号,各种括号等等都是特殊字符,要使它们显示为字面的符号,就需要在前面加上转义字符 \。

部分引用 “

转义字符可以阻止单个字符被解析成特殊意义,但如果是字符串的话可以使用其它的引用方式。使用双引号括起来的引用称为部分引用,又叫弱引用;顾名思义就是不是完全的引用。使用双引号括起来的引用,$符,`符和 \ 符仍会被解析成特殊意义,其它字符都会被解析成字面意义。

[ljx@localhost ~]$ var="a b c"
[ljx@localhost ~]$ echo $var
a b c
[ljx@localhost ~]$ echo "$var"
a b c

可以看到,使用双引用括起来之后,$ 符号仍被解析为取变量的值。当变量的值中有连续多个空格时,直接输出变量的值只会多个空格中的一个,如果想保留所有的空格,就需要使用引用的方式。

全引用 ‘

使用单引号括起来的引用称为全引用,又叫强引用;顾名思义就是完全的引用。包括 $符,` 符,\ 符在内的所有特殊字符都会被解析成字面意思。单引号引用内不能再出现单引号,因为这样引号配对就乱了,用转义字符来转义单引号也不行,因为转义字符在单引号引用内被解析成普通字符,转义工作无法正常进行。

[ljx@localhost ~]$ echo '$PWD'
$PWD
[ljx@localhost ~]$ echo "$PWD"
/d/learn/shell
[ljx@localhost ~]$ echo 'It's a dog'
> '

Its a dog
[ljx@localhost ~]$ echo "It's a dog"
It's a dog
[ljx@localhost ~]$ echo It\'s a dog
It'
s a dog

使用单引号引用时,$ 被解析成普通字符,所以输出结果为 $PWD,使用双引号引用时,$ 仍被解析成取变量值,所以输出结果为 /d/learn/shell。使用单引号引用将 It's a dog括起来,字符串中的单引号与第一个单引号配对了,所以就剩下了一个单引号没法配对;当按下回车时命令并没有执行,而是继续等待输入,继续输入一个单引号,命令才执行,输出结果为 Its a dog,中间的单引号被解析成引用了。正确的写法是后面那两种写法。

命令替换 `

命令替换是指将系统命令的标准输出作为值赋给变量,使用反引号 ` 括起来的引用就是命令替换。除了反引号之外,还可以使用 $()。两者的功能是等价的,但使用 $() 比 ` 会好点;一方面,反引号和单引号看起来太像了,难以区分;另一方面,$() 支持嵌套,而 ` 不支持。但是,$() 只有在 bash 中才有效,而 ` 在所有 unix shell 中都有效,因此反引号更加普遍。

[ljx@localhost ~]$ date1=`date`
[ljx@localhost ~]$ date2=$(date)
[ljx@localhost ~]$ echo $date1 $date2
2017073115:34:56 2017073115:35:02

推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
author-avatar
拍友2502935047
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有