使用双引号执行Linux命令

时间:2017-09-12 22:28:24

标签: linux command-line ksh quotes

所以我试图找出这种奇怪的行为。

"hello hello"

第2和第6个命令与我的问题最相关。如果我运行第二个命令`echo \"hello hello\"` ,那么它将评估它作为一个大的参数。但是,如果我尝试运行最后一个命令

"hello
那么它应该有相同的行为吗?但它将rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done 视为自己的独立词。有些人可以解释一下,以及如何让第6个命令像第二个命令一样工作,这样它就可以评估"你好你好"作为一个完整的陈述?

(这有一个更实际的应用,但这是我可以制作的最小的例子。)

提前谢谢!

编辑:我看到我得到了一个downvote,所以我会更加具体地讨论我遇到的问题。

rcli4

请注意,redis-cli -p只是(error) ERR wrong number of arguments for 'get' command 的别名。我一直在

Properties | C/C++ Build

这是由于引号被错误地解析。我尝试了不同的组合,例如添加更多引号,删除sed语句等等都无济于事,但我认为能够解决我原来的hello hello问题会让我对如何解决我的具体问题有足够的了解

1 个答案:

答案 0 :(得分:1)

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

如果我按照编辑中的说明正确理解了问题,那么解决方案是在do-loop中引用$line 内部,而不是引用它。因此,请尝试:

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

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

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

最后,我们在数据库键glob AAA*周围放置单引号。如果没有引号,shell会将AAA*解释为文件glob,并在其上执行路径名扩展。如果当前目录中的文件恰好与该glob匹配,则结果将是意外且不需要的。如果设置了bash选项nullglob,则无论当前目录中包含哪些文件,结果都不是您想要的结果。