shell编程之转义和引用
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编程之转义和引用的更多相关文章
- Linux Shell编程变量赋值和引用
我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bin/sh ... 注意:最好使用“! ...
- Linux Shell编程(10)——引用变量
当要引用一个变量的值时,一般推荐使用双引号.使用双引号除了变量名前缀($).后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符.用双引号时$仍被当成特殊字符,允许引用一个被双 ...
- shell编程中星号(asterisk "*")的坑
今天分享一个有关shell编程中由通配符引起的问题. 1. 问题代码 cat test.logs 4567890 * ##*************************************## ...
- shell编程学习笔记(五):Shell中脚本的参数
在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...
- Linux —— Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...
- linux中shell编程
shell编程 1 echo -e 识别\转义符 \a \b \t \n \x十六进制 \0八进制 等等 #!/bin/bash echo -e "hello world" 执行脚 ...
- Shell编程笔记
Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理. 修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...
- linux —— shell 编程(编程语法)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...
- linux —— shell 编程(整体框架与基础笔记)
导读 关于shell编程基础的学习,网上有很多资源,如果在校图书馆应该也有一些教程,所以这里对于零碎的基础不做详细记录,而只是对一些常用的概念.命令与操作做一个简要的记录,以备方便查找. (本文所有语 ...
随机推荐
- MDK5 新建工程提示报错:Load PDSC Dubug Description faild
File : D:\Keil_v5\ARM\PACK\Keil\STM32F0xx_DFP\2.0.0\Keil.STM32F0xx_DFP.pdsc Sequence : CheckID Conte ...
- Java 快速排序法 冒泡排序法 选择排序法 插入排序法
1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...
- c语言学习笔记-do......while
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.do......while函数意义 循环执行(人机交互) 二.do......while函数结构 do{ 语句1: 语句2: ...
- element UI实现表格中添加开关控制按钮
我使用的是element ui V1.4.3 如下图是我要实现的效果: <template> <div> <el-button type="text" ...
- python之MRO和C3算法
python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...
- 安卓开发_startActivityForResult的详细用法
一个需求:一个activity到另一个activity进行一些设置,返回第一个activity的时候 获取第二个activity设置的数据 百度了一下,发现startActivityForResult ...
- [Spark] Spark 安装配置
原文地址:https://www.cnblogs.com/memento/p/9148732.html Windows 上的单机版安装 下载地址:http://spark.apache.org/dow ...
- dmesg七种用法
dmesg 命令的使用范例 ‘dmesg’命令设备故障的诊断是非常重要的.在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息.‘dmesg’命令在多数 ...
- Spark编译
Spark的运行版本使用mvn编译,已经集成在源码中.如果机器有外网或者配置了http代理,可以直接调用编译命令来进行编译. windows&Linux命令如下: ./build/mvn \ ...
- SQL Server 中的回滚
USE [TestDB] GO /****** 对象: Table [dbo].[Person] 脚本日期: 11/23/2008 13:37:48 ******/ SET ANSI_NULLS ON ...