我想在一个字符串中嵌入一个单引号

时间:2016-07-27 02:31:34

标签: linux bash sh

通常,为了在字符串中嵌入引号,使用\(反斜杠)。

反斜杠在Bash脚本中有不同的含义吗?

我的代码无效:未包含引号,并报告了以下错误:

recursive_merge.sh: line 7: unexpected EOF while looking for matching `''
recursive_merge.sh: line 14: syntax error: unexpected end of file

我没有解释。第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

1 个答案:

答案 0 :(得分:3)

正如tripleee在该问题的评论中指出的那样,此特定情况下的最佳方法是使用双引号字符串,您可以在其中使用嵌入两个变量引用(例如$i)和单引号 as ;例如:z="'$i.ala.r$x.sph $i .ala.r$y.sph'"
此答案侧重于生成/嵌入文字'字符的各种方法。在字符串中,从OP的误解开始。

您对'\''的使用表明您对通常用于"嵌入"的解决方法感到困惑。 整体单引号字符串中的单引号,代码在z=...行上执行的操作,因为启动 > '\''

如果我们简化你的命令,我们得到:

echo '\''$i

这是一个语法错误,因为Bash单引号是 unbalanced ,因为'\' 本身被认为是包含文字\的完整单引号字符串,后跟第二个单引号字符串的开始 ',它永远不会封闭

同样值得注意的是,"'$i"是解决此特定问题的最佳解决方案:'可以按原样嵌入,并包含变量引用{{1}在双引号字符串内部保护其值不受可能不需要的word-splitting and filename expansion (globbing)

的影响

类似POSIX的shell无法在单引号字符串中嵌入单引号 - 甚至没有转义。因此,$i中的\只会被视为文字(请参阅下面的解决方法)。

本答案的其余部分显示了生成文字'\'的所有方法,包括内部和外部引用字符串

要在带引号的字符串中创建单个引号 ,只需使用'

\'

仅使用$ echo I am 6\' tall. I am 6' tall. 引用(转义)单个'字符。 但请注意,在命令行上放置在单引号或双引号字符串上下文之外的标记受word-splitting and filename expansion (globbing)的约束。

要在双引号字符串中使用单引号,请按原样使用(不需要转义):

\

如果您还希望在字符串中嵌入变量引用(例如$ echo "I am 6' tall." I am 6' tall. )或命令(通过命令替换,$i),则这是最佳选择(您可以通过转义{{{ 1}}为$(...))。

要在单引号字符串中使用单引号 (其中没有插值(扩展)由设计执行),必须使用解决方法

$

单引号字符串必须采用不支持嵌入式单引号; \$部分只是有意义的内部"内部"一个单引号的字符串:

  • 前导$ echo 'I am 6'\'' tall.' I am 6' tall. 终止单引号字符串到目前为止
  • '\''然后生成一个'字面值,使用\' 外部引用字符串的上下文进行单独转义。
  • 尾随'然后"重新启动"单引号字符串的其余部分。

换句话说:虽然您无法直接嵌入单引号,但您可以将单引号字符串拆分为多个部分,单独插入\ - 转义'实例外部根据需要使用单引号字符串,并让Bash的字符串连接(它自动直接连接相邻的字符串)将它们全部拼凑在一起形成一个字符串。

chepner在评论中指出,您可以使用带有引用开场分隔符here-document,其行为类似于单引号字符串,同时允许嵌入\字符:

'

使用 未加引号的开场分隔符,here-document就像一个双引号字符串,就像后者一样允许嵌入',同时也支持扩展:

read -r var <<'EOF' # quoted delimiter -> like a '...' string, but ' can be embedded
I am 6' tall.
EOF

最后,如果仍然不符合POSIX标准,则可以使用 ANSI C-quoted string字符串,该字符串允许嵌入带' ;
请注意,此类字符串解释控制字符转义序列,例如read -r var <<EOF # unquoted delimiter -> like a "..." string $USER is 6' tall. EOF ,但是,与普通的单引号字符串一样,不执行变量引用或命令替换的插值:

\'