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. [redis] Redis的介绍

    mysql数据库:数据以“文件的形式”存储在硬盘里 网站的瓶颈是在数据库的访问上,mysql数据库是运行在硬盘上面的,把数据放到内存里速度就快多了 Redis是一款内存高速缓存数据库,使用c语言编写, ...

  2. mysql百万的数据快速创建索引

    测试数据本机一张表users有100百万条记录.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加可能不成功,想了很多办法,终于挖坑成功. 开始准备工作, ...

  3. Java学习笔记之——变量与数据类型、运算符

    一.变量 1.变量:变化的值 变量在代码运行期间,开辟了一块空间 .这块空间是有地址的,给这块取了个名字, 这个名字就叫做变量名,这块空间放的东西叫做变量值 2.变量的初始化: (1)先声明再赋值: ...

  4. 安装Java语言的jdk,配置java环境变量

    一.windows 安装jdk win7 下载jdk: 地址   https://www.oracle.com/technetwork/java/javase/downloads/index.html ...

  5. Morley's Therorem(UVA11178+几何)

    题意:Morley定理,求D.E.F的坐标 思路:没什么算法,就是几何的应用.注意旋转角就好了. 转载请注明出处:寻找&星空の孩子 题目链接:UVA11178 #include<cstd ...

  6. lfs(systemv版本)学习笔记-第4页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemv版本)学习笔记第3页:https://www.cnblogs.com/renren-study-notes ...

  7. Js调试中不得不知的Console

    在js调试中,大部分的前端人员都是采用console.log()方法来打印出调试的数据,但是很多人都不知道console这个对象有很多很实在的方法,本文就来介绍一下这些方法的使用. 一.console ...

  8. 洛谷P4438 [HNOI/AHOI2018]道路(dp)

    题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...

  9. Related concepts of testing

    根据是否知道源代码测试可以分为黑盒和白盒. 黑盒:功能测试. 白盒:知道源代码,要写测试代码. 根据测试的粒度. 方法测试: 单元测试: 集成测试: 系统测试: 根据测试的暴力程度. 压力测试:谷歌工 ...

  10. Java并发编程(五)Lock

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...