Shell脚本中带printf数字格式的变量添色报错求助
解决Shell脚本中数字格式化与终端颜色冲突的问题
嗨,我来帮你搞定这个小问题~你遇到的「Invalid number」错误,核心原因是你把颜色转义代码和纯数字拼在一起后,变量就不再是纯数值类型了,而printf的%d、%f这类格式符只能识别纯数字,自然就报错啦。
我们只需要调整一下思路:把颜色渲染和数字格式化分开处理,先输出颜色代码,再用格式符输出纯数字,最后恢复终端默认颜色,就能同时实现颜色和数字格式的需求。
针对整数(%d)的修改方案
直接看修改后的脚本,我给你标了关键说明:
#!/bin/sh warning_color=$(tput setaf 4) # 蓝色终端色 end_color=$(tput sgr0) # 恢复默认终端色 test="30000" result="30000" if [[ ${test} -gt 20000 ]] then # 重点:用%s输出颜色字符串,%'10d输出纯数字,分步骤处理 printf "%s%'10d%s%'10d\n" "${warning_color}" "${test}" "${end_color}" "${result}" else # 不满足条件时,正常输出无颜色的格式化数字 printf "%'10d%'10d\n" "${test}" "${result}" fi
运行这个脚本,你会看到test变量的数字既显示千分位逗号,又带上了蓝色,而且不会报错。
针对浮点数(%f)的扩展方案
如果你的变量是浮点数,需要注意两点:一是浮点数比较不能用[[ ${test} -gt 20000 ]],得用bc工具;二是格式符换成%f系列,比如保留两位小数的%'10.2f,示例脚本如下:
#!/bin/sh warning_color=$(tput setaf 4) end_color=$(tput sgr0) test="30000.78" result="24500.32" # 用bc判断浮点数大小,-l参数启用浮点运算 if [[ $(echo "${test} > 20000" | bc -l) -eq 1 ]] then printf "%s%'10.2f%s%'10.2f\n" "${warning_color}" "${test}" "${end_color}" "${result}" else printf "%'10.2f%'10.2f\n" "${test}" "${result}" fi
关键总结
永远不要把颜色转义序列和数字变量直接拼接——这样会让数字变成带非数字字符的字符串,导致printf的数值格式符无法识别。正确的做法是在printf的格式字符串中,用%s单独处理颜色代码,用数值格式符处理纯数字变量,两者互不干扰。
内容的提问来源于stack exchange,提问作者P.Lonnie
相关产品推荐
相关产品推荐

