bash脚本:printf第二个参数显示颜色代码而非应用颜色,如何解决?
解决Bash中printf参数无法解析颜色转义序列的问题
问题核心原因:printf默认只会解析格式化字符串中的转义字符,作为位置参数传入的字符串里的转义序列会被当作普通文本输出。你第一个参数的颜色代码写在格式化字符串里,所以能正常生效;第二个参数的颜色代码是作为变量传入的,自然会被原样打印。
下面提供两种可行的解决方法:
方法一:将颜色代码整合到格式化字符串中
把红色的起始和结束代码直接嵌入到格式化字符串的对应位置占位符前后,参数只传入纯文本内容即可:
#!/bin/bash # 定义颜色变量 greenColour="\e[0;32m\033[1m" endColour="\033[0m\e[0m" redColour="\e[0;31m\033[1m" # 调整格式化字符串,把颜色代码放到占位符前后 printf "\n${greenColour}[+]${endColour} ${redColour}%-15s${endColour} %s\n" "getPIP" "Shows private IP"
方法二:使用%b格式符解析参数中的转义序列
printf的%b格式符专门用于解析参数中的转义字符,只需把第二个参数的格式符从%s改为%b即可:
#!/bin/bash # 定义颜色变量 greenColour="\e[0;32m\033[1m" endColour="\033[0m\e[0m" redColour="\e[0;31m\033[1m" # 使用%b替代%s来解析转义序列 printf "\n${greenColour}[+]${endColour} %-15b %s\n" "${redColour}getPIP${endColour}" "Shows private IP"
两种方法各有适用场景:方法一适合格式固定的场景,代码可读性更强;方法二更灵活,当颜色或文本内容需要动态生成时,能更方便地组合参数。
内容的提问来源于stack exchange,提问作者Ser Ber
相关产品推荐
相关产品推荐

