shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本;另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义。

一、转义

转义是指使用转义符引用单个字符,从而使其表达单纯的字符的字面含义。Shell中的转义符是反斜杠"\",使用转义符的目的是使转义符后面的字符单纯地作为字符出现,而不解释其特殊的含义。

#试图打印"$Dollar"字符串的错误演示

[root@Cfhost-170820-UCNK ~]# echo $Dollar

#此处打印为空,因为Shell尝试打印出变量Dollar的值,但是这个变量并没有声明,所以打印出空行

#使用转义字符转义$字符

[root@Cfhost-170820-UCNK ~]# echo \$Dollar
$Dollar

#更多例子

#打印乘号。如果不用转义符转义*号,则*号会作为一般的通配符使用,结果是将工作目录中的所有目录和文件名替换它

[root@Cfhost-170820-UCNK ~]# echo 8 \* 8 =64
8 * 8 =64
[root@Cfhost-170820-UCNK ~]# echo john\'s cat
john's cat

在上面的示例中,命令的输出将会是空字符。由于"$"符号是一个特殊字符,所以"$Dollar"被Shell尝试解释为"取出并打印Dollar变量的值“,如果恰巧你在系统中定义了这个变量并给予赋值,那么此处会打印出该变量的值,无论是哪种,都不是你原先想要的结果。这时就要使用"\"来转义"$"字符,让"$"失去其特殊含义,而只作为一个符号出现。

二、引用

引用是指字符串用某种符号括起来,以防止特殊字符被解析为其他意思。比如说上一小节中的转义符就是一种引用。Shell中一共有4种引用符,分别是双引号、单引号、反引号和转义符。其中双引号又叫”部分引用"或“弱引用”,可以引用出除$符、反引号、转义符之外的所有字符;单引号又叫“全引用”或“强引用",可以引用所有字符;反引号则会将反引号括起来的内容解释为系统命令。

1.部分引用

部分引用是指双引号括起来的引用。在这种引用的方式中,$符、反引号(`)、转义符(\)这3种特殊字符依然会被解析为特殊意义。比如,在定义一个变量后,使用echo打印出变量的时候,将它们用双引号括起来,如下所示:

#声明变量VAR03,并用echo打印出来。第一次直接打印,第二次用引号括起来,从输出内容看好像没什么区别

[root@Cfhost-170820-UCNK ~]# VAR03=100
[root@Cfhost-170820-UCNK ~]# echo $VAR03
100
[root@Cfhost-170820-UCNK ~]# echo "$VAR03"
100

#声明变量VAR03,内容为字符串,ABC之间有多个空格

[root@Cfhost-170820-UCNK ~]# VAR04="A B C"

#直接打印变量时,输出内容只保留了每个字母间的一个空格
[root@Cfhost-170820-UCNK ~]# echo $VAR04
A B C

#使用引号括起来的输出内容和变量定义时的内容完全一致的
[root@Cfhost-170820-UCNK ~]# echo "$VAR04"
A B C

2.全引用

全引用是指用单引号括起来的引用。,单引号中的任何字符都只当作是普通字符(除了单引号·本身,也就是说单引号中间无法再包含单引号,即便用转义符转义单引号也不行)。所有在单引号中间无法再包含单引号,即便用转义符转义单引号也不行)。所有在单引号中的字符都只能代表其作为字符的字面意义

单引号和双引号在很多时候是一样的,只是要记住,在双引号中的$符、反引号、转义符还是会被解析成其特殊含义,而在单引号中所有的字符都只是字面意思。下面的例子中,使用双引号括起的内容中,$PWD被解析成/root,而在单引号中只是按照原样输出"$PWD“字符串。

3.命令替换

命令替换是指将命令的标准输出作为值赋给某个变量。比如,在某个目录中输入ls命令查看当前所有目录中的文件,但如何将输出存入某个变量中呢?这就需要使用命令替换了,也就是Shell编程中使用最频繁的功能。

Shell中有两种方式可以完成命令替换,一种是反引号(`),一种是$(),使用方法如下:

运行系统命令date可以获得当前的系统时间。在很多时候我们需要记录脚本运行时间,所以只是运行这个命令没有什么意义,必须将该命令的运行结果记录并保存到变量中,并持久化到文件中,才能为后期分析提供有用的参考依据。

[root@Cfhost-170820-UCNK ~]# DATE_01=`date`
[root@Cfhost-170820-UCNK ~]# DATE_02=$(date)
[root@Cfhost-170820-UCNK ~]# echo $DATE_01
Tue Nov 28 19:48:47 MSK 2017
[root@Cfhost-170820-UCNK ~]# echo $DATE_02
Tue Nov 28 19:49:02 MSK 2017

如果被引用的命令输出的内容包括多行,此时如果不通过引用的方式输出变量,则输出的内容中将会删除换行符,文件名之间会使用系统默认的空来填充,即输出的内容只占一行。

[root@Cfhost-170820-UCNK ~]# LS=`ls -l`
[root@Cfhost-170820-UCNK ~]# echo $LS
total 64 -rw-r--r-- 1 root root 128 Nov 26 15:01 Awd.txt -rw-r--r-- 1 root root 77 Nov 26 16:33 bc.sh -rw-r--r-- 1 root root 39 Nov 26 16:32 cal.bc -rw-r--r-- 1 root root 50 Nov 26 16:10 Namespace01.sh -rw-r--r-- 1 root root 50 Nov 26 16:12 Namespace02.sh -rw-r--r-- 1 root root 192 Nov 26 16:17 Namespace03.c -rw-r--r-- 1 root root 137 Nov 26 16:14 Namespace03.sh -rw-r--r-- 1 root root 8

以上使用反引号的部分都可以使用$()进行替换,因为它们是等价的。但反引号毕竟和单引号看起来类似,有时候会对查看代码造成困难,而使用$()就相对清晰,能有效地避免这种混乱。但是有些情景是必须使用$()的:$()支持嵌套,而反引号不行。

补充说明:Shell中的运算符主要有比较运算符、字符串运算符、文件操作运算符、逻辑运算符、算术运算符。

算术运算符,Java中和shell基本一致

通常运算使用一个关键字 expr

使用该关键字注意:操作符和操作数之间必须以空格隔开,否则无法运算,打出的是字符串

4.特殊字符

通配符,常见的通配符有*、?和用[]括起来的字符序列。其中*代表任意长度的字符串。问号(?)可用于匹配任一单个字符。方括号[]代表匹配其中的任意一个字符.

引号,引号包括单引号和双引号,单引号又称“全引用”或“强引用”;双引号又称"部分引用“或弱引用",所有用双引号括起来的出美元符、反斜杠、反引号依然保持其特殊用途外,其余都作为普通字符处理;而所有用单引号括起的部分都作为普通字符处理,但是要注意单引号中间不能出现双引号,否则Shell无法判断到底哪里是单引号的起止位置。

5.注释符(通常用#,这个不用多说,注释的目的在于增强代码可读性和有利于后期管理)

6.杂项

反引号用于命令替换,和$()的作用相同,表示返回当前命令的执行结果并赋值给变量。

位置参数:

$0:脚本本身

$1、$2...${10}:脚本的第一个参数、第二个参数到第十个参数

$#:变量总数

$*、$@:显示所有参数

$?:前一个命令退出的返回值

$!:最后一个后台进程的ID号

!:通常代表取反

shell编程之转义和引用的更多相关文章

  1. Linux Shell编程变量赋值和引用

    我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):   #!/bin/sh  ...  注意:最好使用“! ...

  2. Linux Shell编程(10)——引用变量

    当要引用一个变量的值时,一般推荐使用双引号.使用双引号除了变量名前缀($).后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符.用双引号时$仍被当成特殊字符,允许引用一个被双 ...

  3. shell编程中星号(asterisk "*")的坑

    今天分享一个有关shell编程中由通配符引起的问题. 1. 问题代码 cat test.logs 4567890 * ##*************************************## ...

  4. shell编程学习笔记(五):Shell中脚本的参数

    在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...

  5. Linux —— Shell编程之变量赋值和引用

    Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...

  6. linux中shell编程

    shell编程 1 echo -e 识别\转义符 \a \b \t \n \x十六进制 \0八进制 等等 #!/bin/bash echo -e "hello world" 执行脚 ...

  7. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

  8. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  9. linux —— shell 编程(整体框架与基础笔记)

    导读 关于shell编程基础的学习,网上有很多资源,如果在校图书馆应该也有一些教程,所以这里对于零碎的基础不做详细记录,而只是对一些常用的概念.命令与操作做一个简要的记录,以备方便查找. (本文所有语 ...

随机推荐

  1. Docker常用命令(二)

    Docker常用命令 查看Docker所有正在运行的容器 docker ps 查看Docker已退出的容器 docker ps -a 查看Docker所有镜像 docker images 删除镜像 删 ...

  2. ajax提交form表单问题

    form表单提交数据可以省下大量大量获取元素的代码,局部刷新时也可以用ajax提交form表单,但是要先把表单序列化,再把后台javaBean对象序列化,但是你有可能前后台都执行了系列化,但是后台还是 ...

  3. 设计模式之享元模式(Flyweight)

    享元模式顾名思义就是羽量级模式或者蝇级模式,形容体量小的应用,该模式主要的设计目的是为了迎合系统大量相似数据的应用而生,减少用于创建和操作相似的细碎对象所花费的成本.大量的对象会消耗高内存,享元模式给 ...

  4. spring boot (2):spring boot 打包tomcat、tomcat 部署多个项目、服务器部署项目SSL 设置(阿里云)

    一.spring boot 内置tomcat配置https: 关于自签名证书可以看下上一篇 spring boot1 更详细的可以看转载 https://www.jianshu.com/p/8d4ab ...

  5. redis 集群搭建

    1.redis 集群 redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用.可扩展等问题,redis集群提供了以下两个好处 1.将数据自动切分( ...

  6. cve-list

    dlink CVE-2018-17786 CVE-2018-17787 CVE-2018-17880 CVE-2018-17881 mongoose CVE-2018-10945 openwrt CV ...

  7. Angular基础(五) 内建指令和表单

    ​ Angular提供了一些内建的指令,可以作为属性添加给HTML元素,以动态控制其行为. 一.内建指令 a) *ngIf,可以根据条件来显示或隐藏HTML元素. <div *ngIf='a&g ...

  8. 使Volley完美支持自定义证书的Https

    其实在最早的版本里,Volley甚至是不支持https协议的,只能跑http,当然你也可以自己修改他的源码让他支持,如今volley的代码经过一些改进以后, 已经可以完美支持https协议了,无论是在 ...

  9. Android常用学习网站

    http://blog.csdn.net/liang5630/article/details/43482691 https://github.com/Trinea/android-open-proje ...

  10. CentOS乱码解决方法

    linux 中文显示乱码解决办法, 其实是有多种情况的, 有一部分是由于终端默认的设置造成的 vi /etc/sysconfig/i18n 将内容改为LANG="zh_CN.GB18030& ...