Bash 如何将命令的结果传递给一行中的另一个命令?
如何在一行中将午夜后的分钟数传递给Bash 如何将命令的结果传递给一行中的另一个命令?,bash,shell,command-line,concatenation,command-line-interface,Bash,Shell,Command Line,Concatenation,Command Line Interface,如何在一行中将午夜后的分钟数传递给cli 这项工作: echo $[ ( ( `date "+%s"` - 28800 ) % 86400 ) / 60 ] // Correctly returns minutes since midnight in PST 但我如何将其传递给另一个命令 这不起作用: my_cli --json '{"minutes" : ' $[ ( ( `date \"+%s\"` - 28800 ) % 86400 ) / 60 ] '}' 返回: date: ill
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)`
以下内容提供了任何时区自午夜起的分钟数,但有一个限制条件,即“午夜”和“现在”可能具有不同的时区偏移量:
$(( ($(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 ))}"
假设分钟数应为整数而不是字符串:
my_cli --json '{"minutes" : '"$(( ( ( $(date +%s) - 18000 ) % 86400 ) / 60 ))"' }'
使用现代shell语法在这里会有所帮助。使用
$(…)
而不是反勾号(这样就不需要转义内部双引号),并使用$(…)
而不是$[…]
。看看你能不能做到。(那份原件在日期格式的引号上有一个错误。)你说得对,原件有一个错误。不需要逃避“
.BTW,一般来说,使用字符串连接来构建JSON并不是一个很好的实践,尽管在这里是安全的,其中被替换的变量永远都是数字;当输入类型的约束不如此好时,最好使用jq、jsawk或类似的工具。@Ryan,我删除了它,因为rici在正确的轨道上,所以我的是重复的。也就是说,我可以继续测试并重新添加它;麦克波特公司。将安装gdate
(我认为这是coreutils
)的一部分。这看起来很有希望,除非我在Mac OS X上收到日期:非法时间格式
错误。(从午夜命令开始的第一分钟)@Ryan:是的,Mac OS X有一个完全不同的参数约定。我认为-d
在macosx上也不起作用,您需要调整日期格式或解析格式(请参见-f
标志)。我手边没有mac电脑。@Ryan:如果我正确阅读手册页,这可能会起作用:$(日期+%s-f%Y-%m-%d$(日期+%Y-%m-%d))
(对于减号后面的部分)