执行带双引号的 Linux 命令

Executing Linux commands with double quotes

所以我想弄清楚这种奇怪的行为。

$ hello hello           
-ksh: hello: not found [No such file or directory]
$ "hello hello"
-ksh: hello hello: not found [No such file or directory]
$ echo hello hello
hello hello
$ `echo hello hello`
-ksh: hello: not found [No such file or directory]
$ echo \"hello hello\"
"hello hello"
$ `echo \"hello hello\"`
-ksh: "hello: not found [No such file or directory]

第二条和第六条命令与我的问题最相关。如果我 运行 第二个命令 "hello hello",那么它会将其评估为一个大参数。但是,如果我尝试 运行 最后一个命令

`echo \"hello hello\"`

那么它应该有相同的行为吗?但它将 "hello 视为自己的独立词。有人可以解释一下吗,以及我如何让第 6 个命令像第二个命令一样工作,以便将 "hello hello" 作为一个完整的语句进行评估?

(这有更实际的应用,但这是我能制作的最小示例)。

提前致谢!

编辑:我看到我投了反对票,所以我会更具体地说明我遇到的问题 运行。

rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done

请注意 rcli4 只是 redis-cli -p 的别名。我不断收到

(error) ERR wrong number of arguments for 'get' command

这是由于引号解析错误造成的。我尝试了不同的组合,例如添加更多引号、删除该 sed 语句等,但无济于事,但我认为能够解决我最初的 hello hello 问题将使我对如何解决我的特定问题有足够的了解。

在带引号的字符串中,引号只是另一个字符。它没有特殊的力量。

如果我正确理解编辑中所述的问题,解决方案是在 $line do 循环中引用 $line ,而不是在它之前。因此,尝试:

rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done

没有 $line 周围的双引号,shell 将执行 分词 路径名扩展 line 的内容。你也不想要。双引号抑制两者。

此外,我们还向 read 添加了 -r 选项。这可以防止 readline 的内容进行反斜杠处理。

最后,我们在数据库键 glob 周围加上单引号 AAA*。如果没有引号,shell 会将 AAA* 解释为文件 glob 并将对其执行 路径名扩展 。如果当前目录中恰好有文件与该 glob 匹配,结果将是意想不到的和不需要的。如果设置了bash选项nullglob,不管当前目录下有什么文件,结果都不是你想要的。