执行带双引号的 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
选项。这可以防止 read
对 line
的内容进行反斜杠处理。
最后,我们在数据库键 glob 周围加上单引号 AAA*
。如果没有引号,shell 会将 AAA*
解释为文件 glob 并将对其执行 路径名扩展 。如果当前目录中恰好有文件与该 glob 匹配,结果将是意想不到的和不需要的。如果设置了bash选项nullglob,不管当前目录下有什么文件,结果都不是你想要的。
所以我想弄清楚这种奇怪的行为。
$ 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
选项。这可以防止 read
对 line
的内容进行反斜杠处理。
最后,我们在数据库键 glob 周围加上单引号 AAA*
。如果没有引号,shell 会将 AAA*
解释为文件 glob 并将对其执行 路径名扩展 。如果当前目录中恰好有文件与该 glob 匹配,结果将是意想不到的和不需要的。如果设置了bash选项nullglob,不管当前目录下有什么文件,结果都不是你想要的。