通常,为了在字符串中嵌入引号,使用\
(反斜杠)。
反斜杠在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
答案 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
,但是,与普通的单引号字符串一样,不执行变量引用或命令替换的插值:
\'