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

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

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

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

第一种:转义

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

例如:

#!/bin/bash

name="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/bash

name="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/bash

name="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/bash

name="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解析器会对内容做单词拆分和路径展开,最终导致的结果就是,如果你的内容里有转义字符、留白等内容,这些内容将会失效,而且会影响其他的内容解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值