如何修复Bash中调用printf的可变参数print_error函数
问题原因
你现有代码的错误核心是printf的格式字符串使用逻辑错误:
- 你硬编码的格式串
"%s: ERROR: %s\n"仅包含2个%s占位符,而你后续传入了$script_name、用户提供的格式串、以及N个可变参数,总参数个数超过2个 - Bash的
printf设计逻辑是:当传入参数数量多于格式串占位符数量时,会循环复用格式串处理剩余参数,这就是你会多出第二行错误输出的原因 - 同时你把用户传入的带占位符的格式串当成了普通字符串填充到第二个
%s的位置,没有让它作为格式串的一部分生效,所以输出里的%s没有被替换成日期内容
解决方案
直接修改print_error函数,把固定前缀和用户传入的格式串拼接为完整的格式控制字符串即可,修改后的完整代码如下:
#!/bin/bash script_name="tmp.bash" function print_error { local format="$1" shift # 拼接生成完整的printf格式串,再传入所有参数匹配占位符 printf "%s: ERROR: ${format}\n" "$script_name" "$@" } # 测试调用 print_error "Today is %s; tomorrow is %s" "$(date)" "$(date -d "+1 day")"
验证说明
修改后运行脚本,输出会完全符合你的预期:
tmp.bash: ERROR: Today is Mon Nov 22 15:10:40 PST 2021; tomorrow is Tue Nov 23 15:10:50 PST 2021
内容的提问来源于stack exchange,提问作者hermit.crab
相关产品推荐
相关产品推荐

