如何用Linux单行命令实现秒转时分秒并隐藏零值输出?
问题与解决方案
问题描述
我找到了一个将秒数转换为时分秒格式的bash实现,代码如下:
secs=88023 printf '%dh %dm %ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))
但这个命令会输出包含0值的结果,比如会显示1h 0m 27s,而我想要的是1h 27s这种自动剔除0值部分的格式。
我希望用printf或其他Linux基础工具实现这种条件输出,并且要写成单行命令,不想用if..else语句。我知道JavaScript里可以用三元表达式实现类似逻辑:
console.log(`...${minutes === 0 ? '' : ` ${minutes}`}`)
另外还看到一个awk的方案,代码如下:
echo $secs | awk '{printf "%d %d %d", $1/3600, ($1/60)%60, $1%60}'
可行的单行解决方案
方案1:利用Bash参数展开拼接输出
通过计算各时间分量,再用Bash的参数展开语法判断是否需要输出对应部分,最后清理多余空格:
secs=88023; h=$((secs/3600)); m=$((secs%3600/60)); s=$((secs%60)); printf "%s\n" "${h:+"${h}h "}"${m:+"${m}m "}"${s}s" | sed 's/ $//'
${var:+"内容"}语法表示:当var的值非0时,才输出后面的内容;- 最后用
sed移除末尾可能残留的空格。
方案2:用Awk实现条件格式化
直接在Awk里计算各分量并判断是否输出,逻辑清晰且单行完成:
secs=88023; awk -v s="$secs" '{h=int(s/3600); m=int((s%3600)/60); s=s%60; printf "%s%s%s\n", h?h"h ":"", m?m"m ":"", s?s"s":"0s"}'
h?h"h ":""是Awk的三元表达式写法:当h大于0时输出${h}h,否则输出空字符串;- 最后处理全0的特殊情况(比如
secs=0时输出0s)。
方案3:Bash命令串联+printf输出
用&&控制只有分量非0时才生成对应字符串,再通过printf拼接:
secs=88023; printf "%s%s%s\n" $((h=secs/3600))&&echo"${h}h " $((m=secs%3600/60))&&echo"${m}m " $((secs%60))s | sed 's/ / /g; s/^ //'
$((h=secs/3600))&&echo"${h}h "表示:先计算小时数赋值给h,如果h非0则输出${h}h;- 最后用
sed合并多余空格,处理开头可能的空格。
内容的提问来源于stack exchange,提问作者sloppy
相关产品推荐
相关产品推荐

