代码之家  ›  专栏  ›  技术社区  ›  Sidd Singal

使用双引号执行Linux命令

  •  0
  • Sidd Singal  · 技术社区  · 8 年前

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

    $ 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 作为它自己的独立词。有人能解释一下这一点吗?我如何让第六个命令像第二个命令一样工作,使它将“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问题将让我有足够的洞察力来解决我的具体问题。

    1 回复  |  直到 8 年前
        1
  •  1
  •   John1024 David C. Rankin    8 年前

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

    如果我正确理解了编辑中所述的问题,那么解决方法就是引用 $line do循环,而不是在它之前。因此,尝试:

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

    $行 单词分割 路径名扩展 关于 line

    此外,我们还添加了 -r read . 这可以防止 从对 线 .

    AAA* . 如果没有引号,shell将解释 作为文件glob并将执行