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号

!:通常代表取反

最新文章

  1. package、import和import static
  2. Android 自带图标库 android.R.drawable
  3. HDU 5040
  4. CF478 B. Random Teams 组合数学 简单题
  5. SQL Server Management Studio Keyboard shortcuts
  6. MyEclipse反编译Class文件
  7. 内存管理、ARC
  8. Codeforces Round #349 (Div. 1) A. Reberland Linguistics dp
  9. Entity Framework 学习笔记(一)安装
  10. iOS导航条渐变透明
  11. Linux CentOS 7 下 JDK 1.7 安装与配置
  12. centos7网络配置方法
  13. MQ(1)---消息队列概念和使用场景
  14. Baltic Dry Index
  15. Delphi---TServerSocket和TClientSocket发送和接收大数据包
  16. POJ3090 Visible Lattice Points (数论:欧拉函数模板)
  17. 实现一个简单的shared_ptr
  18. 【第一章】 第一个spring boot程序
  19. python之socket运用之传输大文件
  20. oracle增加sequence

热门文章

  1. 【Redis】4、Redis学习资料
  2. 使用git push命令如何忽略不想提交的文件夹或者文件
  3. 海西 · 云交付 DevOps实践落地方案
  4. javasript中var、let和const区别
  5. Linux 为linux enterprises 6安装图形桌面教程
  6. The ADB instructions
  7. Python多继承
  8. char/varchar/nvarchar的区别
  9. 使用EWS API读取邮件
  10. rpm安装时出现循环依赖