Bash单引号未知行为

Z.S*_*mon 1 bash sed

我在这里已经阅读了Bash中单引号和双引号之间的区别,即单引号将不允许任何插值。但是我遇到了这样一种情况,单引号实际上是插值变量值的唯一方法。为了示例,我创建了一个名为“ test_file”的文件,其中包含

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

我在同一目录中创建了一个脚本,该脚本的目的是提取该文件的各个部分,我将其称为test.sh,其内容如下:

#!/bin/bash
BEGIN=3
END=9

cat test_file | sed -n ''$BEGIN', '$END'p'
Run Code Online (Sandbox Code Playgroud)

现在,我尝试了最后一行的不同设置,例如:

cat test_file | sed -n '${BEGIN}, ${END}p'
cat test_file | sed -n '"${BEGIN}", "${END}"p'
cat test_file | sed -n '"$BEGIN", "$END"p'
Run Code Online (Sandbox Code Playgroud)

但是他们都不起作用。我的问题是:为什么这样工作?

che*_*ner 5

两种风格的引号都是一种快捷方式:它们使封闭的字符被视为,每个字符都由进行了转义\。那么,单引号和双引号之间的区别在于,双引号不会转义$(或后面的字符构成扩展的一部分),从而允许进行参数和命令替换(结果也被视为双引号字符串) 。

您的第一个字符串包括一个空字符串'',后跟一个无引号的扩展名,然后是文字字符串,,无引号的扩展名和一个literal p

您的第二个是单字面值。

第三部分在文字字符串${BEGIN}和周围添加文字双引号${END}

第四个与第三个相似,但是删除了文字{}

正确的字符串

sed -n "$BEGIN, ${END}p"  # sed -n "3, 9p"
Run Code Online (Sandbox Code Playgroud)