所以我想找出这种奇怪的行为。
$ 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“作为一个完整的语句来计算了吗?
(这有一个更实际的应用程序,但这是我能举出的最小的例子)。
提前谢谢你!
编辑:我看到我被否决了,所以我会更具体地说明我遇到了什么问题。
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问题将给我足够的洞察力来解决我的具体问题。
发布于 2017-09-13 17:25:02
在引用字符串中,引号只是另一个字符。它没有特殊的力量。
如果我正确地理解了编辑中所述的问题,解决方案是引用$line in 中的do-循环,而不是在它之前。因此,试着:
rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done如果没有$line周围的双引号,shell将对line的内容执行分词和路径名扩展。你也不想。双引号使两者都受到抑制。
此外,我们还将-r选项添加到read中。这使read无法对line的内容执行反斜杠处理。
最后,我们在数据库键glob AAA*周围放置单引号.如果没有引号,shell将将AAA*解释为文件glob,并对其执行路径名扩展。如果在当前目录中碰巧有与该glob相匹配的文件,则结果将是意外的和不需要的。如果设置了bash选项nullglob,结果将不是您想要的结果,不管当前目录中有哪些文件。
https://stackoverflow.com/questions/46186218
复制相似问题