【问题标题】:Executing Linux commands with double quotes使用双引号执行 Linux 命令
【发布时间】:2017-09-12 22:28:23
【问题描述】:

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

$ 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 个命令像第 2 个命令一样工作,以便将“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 问题将使我对如何解决我的具体问题有足够的了解。

【问题讨论】:

  • 在带引号的字符串中,引号只是另一个字符。它没有特殊的力量。
  • @John1024 是的,我就是这么想的,但我想知道是否有办法让它适用于第 6 个示例。
  • @SiddSingal 这可能会有所帮助:I'm trying to put a command in a variable, but the complex cases always fail!。该链接是为 bash 编写的,但我希望相同的原则也适用于 ksh。
  • @SiddSingal 如果我正确理解了编辑中所述的问题,则解决方案是引用 $line inside do-loop,而不是在它之前。因此,请尝试:rcli4 6379 keys AAA* | while read -r line; do rcli4 6379 get "$line"; done
  • @John1024 嗯哇好吧....那行得通....如果您愿意,可以将其发布为答案,我会接受。感谢您的帮助!

标签: linux command-line ksh quotes


【解决方案1】:

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

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

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,则无论当前目录中有哪些文件,结果都不会是您想要的。

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多