通常,为了在字符串中嵌入引号,\使用(反斜杠)。
反斜杠在 Bash 脚本中是否有不同的含义?
我的下面的代码不起作用:未包含引号,并报告了以下错误:
recursive_merge.sh: line 7: unexpected EOF while looking for matching `''
recursive_merge.sh: line 14: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
我没有解释。14号线根本不存在。
#!/bin/bash
#############this file should be in the directory directly upper than p0x. sphnum.txt should also be at the same directory
for i in 02 03 04 05 06 07 09 10 11 12 13 14 15 16 17 20 21 22 23 24 25; do
x=$(grep $i sphnum.txt |cut -c5-6)
y=$(grep $i sphnum.txt |cut -c8-9)
z=$(echo '\''$i'.ala.r'$x'.sph '$i'.ala.r'$y'.sph\'')
w=$(echo $i'.ala.r'$x'r'$y'.sph')
echo $z
echo $w
cd p$i/spheres.10_2_75/sph/
/project/Biogroup/Software/Docking/MergeSpheres.pl -s $z -o $w -n 500 &
cd ../../../
done
Run Code Online (Sandbox Code Playgroud)
正如Tripleee在对该问题的评论中指出的那样,在这种特定情况下的最佳方法是使用双引号字符串,您可以在其中嵌入变量引用(例如)$i和单引号;例如: z="'$i.ala.r$x.sph $i .ala.r$y.sph'"
这个答案重点关注生成/嵌入文字'字符的各种方法。在 strings 中,从OP的误解开始。
您的使用'\''表明您对通常用于在整个单引号字符串中“嵌入”单引号的解决方法感到困惑,这不是您的代码在线执行的操作z=...,因为它以'\''.
如果我们简化你的命令,我们会得到:
echo '\''$i
Run Code Online (Sandbox Code Playgroud)
这是一个语法错误,因为对于 Bash 来说,单引号是不平衡的,因为'\' 它本身被认为是一个包含文字的完整单引号字符串\,后面跟着第二个单引号字符串的开头,该字符串永远不会 关闭。'
再次值得注意的是,这"'$i"是解决这个特定问题的最佳解决方案:可以'按原样嵌入,并且$i在双引号字符串内包含变量引用可以保护其值免受潜在不需要的分词和文件名扩展(通配符)的影响。
类似 POSIX 的 shell 不提供在单引号字符串中嵌入单引号的方法- 即使转义也不行。因此,\in'\'被简单地视为文字(请参阅下面的解决方法)。
这个答案的其余部分显示了生成文字的所有方法',包括在带引号的字符串内部和外部。
要在带引号的字符串之外创建单引号,只需使用\':
$ echo I am 6\' tall.
I am 6' tall.
Run Code Online (Sandbox Code Playgroud)
这仅引用(转义)单个'字符,使用\. 但请注意,放置在命令行上单引号或双引号字符串上下文之外的标记会受到分词和文件名扩展(通配符)的影响。
要在双引号字符串内使用单引号,请按原样使用(无需转义):
$ echo "I am 6' tall."
I am 6' tall.
Run Code Online (Sandbox Code Playgroud)
如果您还想在字符串中嵌入变量引用(例如,$i)或命令(通过命令替换, )(您可以通过转义为来抑制插值),那么这是最佳选择。$(...)$\$
要在单引号字符串内使用单引号(其中设计不执行插值(扩展)),您必须使用解决方法:
$ echo 'I am 6'\'' tall.'
I am 6' tall.
Run Code Online (Sandbox Code Playgroud)
由于单引号字符串根本不支持嵌入单引号,因此需要解决此问题;该'\''部分仅在单引号字符串“内部”有意义,因为:
'终止单引号字符串\'生成一个在带引号的字符串的上下文之外'单独转义的文字。\ '“重新启动”单引号字符串的其余部分。换句话说:虽然你不能直接嵌入单引号,但你可以将单引号字符串分成多个部分,根据需要在单引号字符串外部\插入单独的转义'实例,并让 Bash 的字符串串联(自动连接直接相邻的字符串) string)将它们全部重新组合在一起以形成单个字符串。
chepner在评论中指出,您可以选择使用带有引号的开始分隔符的此处文档,它的作用类似于单引号字符串,同时允许嵌入'字符:
read -r var <<'EOF' # quoted delimiter -> like a '...' string, but ' can be embedded
I am 6' tall.
EOF
Run Code Online (Sandbox Code Playgroud)
使用不带引号的开始定界符,here-document就像一个双引号字符串,就像后者一样,也允许嵌入',同时还支持扩展:
read -r var <<EOF # unquoted delimiter -> like a "..." string
$USER is 6' tall.
EOF
Run Code Online (Sandbox Code Playgroud)
最后,如果不需要保持 POSIX 兼容,则可以使用ANSI C 引用的字符串,它允许使用 ; 嵌入单引号\'。
请注意,此类字符串解释控制字符转义序列,例如\n,但除此之外,与普通的单引号字符串一样,不执行变量引用或命令替换的插值:
$ echo $'I am 6\' tall.'
I am 6' tall.
Run Code Online (Sandbox Code Playgroud)