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