【问题标题】:How can I pass the result of a command to another command in one line?如何在一行中将命令的结果传递给另一个命令?
【发布时间】:2015-05-20 16:22:38
【问题描述】:

如何将午夜后的分钟数传递给cli

这行得通:

echo $[ ( ( `date "+%s"` - 28800 ) % 86400 ) / 60 ]
// Correctly returns minutes since midnight in PST

但是我怎样才能将它传递给另一个命令呢?

这不起作用:

my_cli --json '{"minutes" : ' $[ ( ( `date \"+%s\"` - 28800 ) % 86400 ) / 60 ] '}'

返回:

date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
ERROR: "my_cli json" was called with arguments ["-300", "}"]
Usage: "my_cli json"

我也试过了:

my_cli --json "{\"minutes\" : \$[ ( ( $(date "+%s") - 28800 ) % 86400 ) / 60 ] }"

我收到以下错误:

...unexpected token at '{"connection" : $[ ( ( 1432139956 - 28800 ) % 86400 ) / 60 ] }' (JSON::ParserError)`

【问题讨论】:

  • 使用现代 shell 语法会有所帮助。使用$(...) 而不是反引号(这样你就不需要转义内部双引号)并使用$((...)) 而不是$[...]。看看你能不能做到这一点。 (该原件对我来说是关于日期格式的引号的错误。)
  • 你是对的,原来的有错误。不需要转义"
  • 顺便说一句,使用字符串连接来构建 JSON 通常不是一个好习惯,尽管在这里它是安全的,其中被替换的变量只会是数字;当输入类型的约束比这少时,最好使用 jq、jsawk 或类似工具。
  • @Ryan,我删除了它,因为 rici 在正确的轨道上,所以我的是重复的。也就是说,我可以继续测试并重新添加它。
  • 顺便说一句,如果你想在 OS X 上使用 GNU 日期,那是可行的;麦克波特公司将安装gdate(我认为是coreutils的一部分)。

标签: bash shell command-line concatenation command-line-interface


【解决方案1】:

假设分钟数应该是整数而不是字符串:

my_cli --json '{"minutes" : '"$(( ( ( $(date +%s) - 18000 ) % 86400 ) / 60 ))"' }'

【讨论】:

    【解决方案2】:

    以下提供任何时区自午夜以来的分钟数,但条件是“午夜”和“现在”可能有不同的时区偏移:

    $(( ($(date +%s) - $(date +%s -d$(date +%Y-%m-%d))) / 60 ))
    

    (我使用了$((...))$(...) 的形式,而不是过时和弃用的$[...]`...`。)

    您可能需要为您的 CLI 提供一个参数,因此您需要小心引用。例如:

    my_cli --json "{\"minutes\" : $(( ($(date +%s) - $(date +%s -d$(date +%Y-%m-%d))) / 60 ))}"
    

    【讨论】:

    • 这看起来很有希望,除非我在 Mac OS X 上收到 date: illegal time format 错误。(自午夜命令以来的第一分钟)
    • @Ryan:是的,mac os x 有一个完全不同的参数约定。我认为-d 也不适用于macosx,您需要调整日期格式或解析格式(请参阅-f 标志)。我没有方便的 mac 玩。
    • @Ryan:如果我正确阅读了手册页,这可能会起作用:$(date +%s -f%Y-%m-%d $(date +%Y-%m-%d))(对于减号后面的部分)
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2012-06-28
    • 2021-06-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多