执行我的代码的以下部分时,出现错误:语法错误:预期的操作数(错误令牌为“ /(60 * 60 * 24)”)
# \function convertsecs2dhms
# \brief convert seconds to days hour min sec
#####################################################################################################################
function convertsecs2dhms()
{
((d=${1}/(60*60*24)))
((h=(${1}%(60*60*24))/(60*60)))
((m=(${1}%(60*60))/60))
((s=${1}%60))
printValue=`printf "%02d days %02d hours %02d minutes %02d seconds \n" $d $h $m $s`
printInfo "$printValue"
}
这是我得到的错误:
(standard_in) 1: syntax error
expr: syntax error
Estimated time for migration completion for server:-
./migration.sh: line 983: ((: d=/(60*60*24): syntax error: operand expected (error token is "/(60*60*24)")
./migration.sh: line 984: ((: h=(%(60*60*24))/(60*60): syntax error: operand expected (error token is "%(60*60*24))/(60*60)")
./migration.sh: line 985: ((: m=(%(60*60))/60: syntax error: operand expected (error token is "%(60*60))/60")
./migration.sh: line 986: ((: s=%60: syntax error: operand expected (error token is "%60")
00 days 00 hours 00 minutes 00 seconds
答案 0 :(得分:4)
仅用双括号不足以在纯sh
中选择算术上下文。
# don't use non-portable "function" keyword
convertsecs2dhms () {
# use $((...)) for arithmetic
d=$((${1}/(60*60*24)))
h=$(((${1}%(60*60*24))/(60*60)))
m=$(((${1}%(60*60))/60))
s=$((${1}%60))
# use printf -v
printf -v printValue "%02d days %02d hours %02d minutes %02d seconds \n" $d $h $m $s
printInfo "$printValue"
}
另请参阅https://mywiki.wooledge.org/ArithmeticExpression,但请注意,其中大多数描述的是Bash,而不是POSIX sh
。
答案 1 :(得分:0)
这不能回答您为什么有这些错误的问题。答案由tripleee给出。这个答案为您提供了另一种实现目标的方法。
您可能感兴趣的是使用date
命令
convertsec2dhms () {
date -d "@$1" "+$(($1/86400)) days and %H hours %M minutes %S seconds";
}
要获得天数,我们将整数除以86400秒。假设日期是以UNIX时间(即从1970-01-01T00:00:00开始的秒数)给出的,则可以通过date命令获得小时,分钟和秒。
注意:您不能使用每年的天计算(%j
),因为这总是会给您额外的一天(1月1日是第1天而不是第0天)。
$ convertsec2dhms 69854632
808 days and 12 hours 03 minutes 52 seconds