shell中需要嵌套多段字符串时如何保证字符能正常解析

embedded/2024/9/24 11:17:50/

shell字符串的嵌套需求出现在,我们要获取一个变量,或者这个字符串中需要存在一个路径等复杂情况下。

一般情况下shell脚本的字符串可以使用"123"(双引号)或者是'123'(单引号)的形式来表达,同时按照规标准的范写法要求是单引号或双引号之间可以嵌套,但是必须可以被区分,就是说你不能单引号里直接再写一个单引号。

而在实际的使用中,多数情况下,要拼接的语句比较复杂,这时导致标准写法反而成了限制,因此除了标准的双引号与单引号嵌套写之外,常见的书写方法有下面几种。

第一种:转义

这种方式,可以让我们写脚本的时候,对特殊字符做保留

例如:

#!/bin/bashname="John"
dir="/path/to/directory"
full_string="The name is \"$name\" and the directory is \"$dir\""
echo $full_string

这个脚本最终会正常输出,输出内容中会正常保留双引号,但是一般不常用,因为它并不能识别换行之类的,而且需要保留特殊字符的需求基本没有,有些鸡肋。

The name is "John" and the directory is "/path/to/directory"

第二种:内部统一用单引号嵌套

直接单引号包裹的字符串不会解析变量和特殊字符,但是如果在外层使用双引号,内层使用单引号,则没有这个限制,因为这种写法中单引号被识别成字符串内容的一部分,而不是一个包裹字符串的语法。

例如:

#!/bin/bashname="John"
dir="/path/to/directory"
full_string="The name is '$name '$name' $dir' and the directory is "$dir" "
#这个输出单引号做语法格式被解析
echo '$name'
#这个输出单引号是字符串的一部分
echo $full_string

这个脚本最终会正常输出

$name
The name is 'John 'John' /path/to/directory' and the directory is /path/to/directory

第三种:退出并重新进入双引号

你可以通过关闭双引号,再使用变量或路径,然后再打开双引号来实现嵌套。

例如:

#!/bin/bashname="John"
dir="/path/to/directory"
full_string="The name is '"$name"' and the directory is '"$dir"' "
echo $full_string

这个脚本最终会正常输出,等价于字符串拼接。

The name is 'John' and the directory is '/path/to/directory'

第四种:重定向写入

这种方法使得你,不需要最外侧的符号,只需要关注好,内部调用复杂拼接时的字符串即可。

例如:

#!/bin/bashname="John"
dir="/path/to/directory"full_string=$(cat <<EOF
The name is "$name" and the directory is "$dir"
EOF
)echo "$full_string"

最后也会输出如下数据

The name is "John" and the directory is "/path/to/directory"

这个方法用的很少,因为有前面两种方式就够了,使用的时候要注意的是,在最后的调用阶段,最好是使用一个双引号,就如同我上面脚本中最后一行写的那样

echo "$full_string"

因为,如果你直接调用它,那面shell解析器会对内容做单词拆分和路径展开,最终导致的结果就是,如果你的内容里有转义字符、留白等内容,这些内容将会失效,而且会影响其他的内容解析。


http://www.ppmy.cn/embedded/116065.html

相关文章

MES系统使用C#实现SolidWorks图纸批量转换PDF在线查看

通过 eDrawings API 批量将 SOLIDWORKS 文件导出为 PDF&#xff08;无需 SOLIDWORKS 软件&#xff09;。 这个用 C# 开发的控制台应用程序允许通过 SOLIDWORKS eDrawings 的免费版本及其 API 将 SOLIDWORKS、DXF、DWG 文件导出为 PDF。使用此工具无需安装 SOLIDWORKS。 运行工…

案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值

List<Aaa> 中取出 value 最大的前 5 个和最小的 5 个值 要从 List<Aaa> 中取出 value 最大的前 5 个和最小的 5 个值&#xff0c;我们可以使用 Java 8 的流&#xff08;Stream&#xff09;API 来实现。 代码示例&#xff1a; import java.math.BigDecimal; impo…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法&#xff0c;特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里&#xff0c;然后对每个桶内的数据分别进行排序&#xff0c;最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数&#xff0c;因…

基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物种类,商家,咨询商家,用户宠物,宠物托管,宠物状况,宠物用品,用品分类,商家公告,结束托管,账单信息,延长托管 开题报告内容 基于Vue框架的宠物托管系统设计与实现开题报告 一、引言 随着现代生活节奏的加快&#xff0c;越来越…

3. 什么是连接池?为什么使用数据库连接池?

连接池&#xff08;Connection Pool&#xff09; 是一种数据库连接管理技术&#xff0c;用于在应用程序和数据库之间管理数据库连接。连接池通过预先创建和维护一定数量的数据库连接&#xff0c;将这些连接放入一个“池”中&#xff0c;供应用程序重复使用。这种方法避免了频繁…

uniapp map设置高度为100%后,会拉伸父容器的高度

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

数模方法论-无约束问题求解

一、基本概念 无约束问题在数学建模中是指优化过程中没有任何限制条件的情况。这种问题旨在寻找一个决策变量集合&#xff0c;使得某个目标函数&#xff08;如成本、效益或其他需要优化的量&#xff09;达到最大或最小值。具体来说&#xff0c;无约束问题通常可以表示为&#x…

Centos 7 搭建Samba

笔记&#xff1a; 环境&#xff1a;VMware Centos 7&#xff08;网络请选择桥接模式&#xff0c;不要用NAT&#xff09; 遇到一个问题就是yum 安装404&#xff0c;解决办法在下面&#xff08;没有遇到可以无视这句话&#xff09; # 安装Samba软件 yum -y install samba# 创建…