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编程基础的学习,网上有很多资源,如果在校图书馆应该也有一些教程,所以这里对于零碎的基础不做详细记录,而只是对一些常用的概念.命令与操作做一个简要的记录,以备方便查找. (本文所有语 ...
随机推荐
- JavaScript 变量作用域 详解
变量作用域要点 - 在JavaScript中没有块级作用域,只有函数作用域 - 在函数体内,局部变量的优先级高于同名的全局变量 - 在全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用v ...
- Mysql无法选取非聚合列
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)Mysql 无法选取非聚合列. 更多讨论或者错误提交,也请移步. 1. 前言 最近升级博客,给文章页 ...
- 4个错误使用JavaScript数组方法的案例
译者按: 做一个有追求的工程师,代码不是随便写的! 原文: Here's how you can make better use of JavaScript arrays 译者: Fundebug 为 ...
- Thymeleaf学习记录(1)--启动模板及建立Demo
Thymeleaf是什么? Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎.相比于JSP,Thymeleaf更简洁,渲染性能更好,维护性更好,它可以XML/XHTML/HTM ...
- deepin使用笔记-解决安装并解决gvim没有启动器的问题
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装gvim #apt-get install vim-gtk3 2.创建桌面启动器 创建/usr/share/applic ...
- Python 练习:三级菜单选择城市(二)
优化了上一个三级菜单选择城:http://www.cnblogs.com/klvchen/p/8646466.html info = { 'GuangDong':{ 'GuangZhou': ['Ti ...
- 中软高科WEB前端面试题
一个朋友面试的题目,百度了一下这个中软高科貌似是一个培训机构...以下答案是我本人的理解,仅供参考 HTML+CSS 1.你能解释一下css的盒子模型吗? 有两种盒子模型:IE盒子模型,W3C盒子模型 ...
- 《AngularJS入门与进阶》图书简介
一.图书封面 二.图书CIP信息 图书在版编目(CIP)数据 AngularJS入门与进阶 / 江荣波著. – 北京 : 清华大学出版社, 2017 ISBN 978-7-302-46074-9 Ⅰ. ...
- Landsat8 卫星数据下载
具体参考 https://www.ixxin.cn/2016/11/27/landsat8freedata/
- 一文学redis操作(记录向)
相关内容: 虽然有参考文档,而且记忆太多也是耗脑,但学习的时候还是想要有个系统划分开知识点的文档,即使不要求去细致记忆,但划分开知识块后脑子里的印象才会更清晰,所以就有了这个博文. 主要是将各种命令进 ...