所以我想弄清楚这种奇怪的行为。
$ 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 问题将使我对如何解决我的特定问题有足够的了解。
最佳答案
在带引号的字符串中,引号只是另一个字符。它没有特殊的力量。
如果我正确理解编辑中所述的问题,解决方案是在 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,则无论当前目录中有什么文件,结果都不是您想要的。
关于linux - 使用双引号执行 Linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186218/