【问题标题】:Bash Script printf colors from variable?来自变量的Bash Script printf颜色?
【发布时间】:2016-06-15 15:24:04
【问题描述】:

我希望看看是否有人能指出我做错了什么,因为我很困惑。我正在尝试学习 bash 脚本来部署开发测试服务器。我试图实现的一件事是在脚本的一部分完成或操作完成时输出状态输出。举个例子:

    printf "[ %s ] %s distribution detected. Validated as supported by this script.\n" "$PASSED" "$LINUX_DISTRO"

我遇到的问题是格式化第一个字符串%s 的值,即$PASSED。在脚本的开头,我将$PASSED 定义为

PASSED="\e[32mPASSED\e[0m"

但是,当我去执行脚本时,输出如下所示:

[ \e[32mPASSED\e[0m ] CENTOS distribution detected. Validated as supported by this script.

而不是看起来像这样的正确输出:

[ PASSED ] CENTOS distribution detected. Validated as supported by this script.

“PASSED”用绿色写成。

但是,我确实注意到,如果我执行以下操作:

printf "[ $PASSED ] %s distribution detected. Validated as supported by this script.\n" "$LINUX_DISTRO"

上述行为正确,但我认为这不是正确的做法。有什么想法吗?

【问题讨论】:

  • 不要在字符串中硬编码终端转义,直到您知道要写入的终端类型。不是全世界都是VT100!我建议你使用 tput 或类似的 - 这就是它的用途。
  • @TobySpeight 我会看看tput。干杯

标签: c bash shell


【解决方案1】:

另一种(非标准)解决方案是将转义字符直接放在原始字符串中,而不是\eprintf 进行解释。

PASSED=$'\e[32mPASSED\e[0m'
printf '[ %s ] some test\n' "$PASSED"

但是,这假定您的脚本由 /bin/bash 运行,而不是 /bin/sh(可能 bash,但在 POSIX 兼容模式下运行)。

使用%b 有同样的问题:它特定于bash,您可能不想假设bash 是执行脚本的shell。

完全符合 POSIX 的解决方案是使用 printf 本身来创造 PASSED 的价值。

# \e not supported by POSIX; use \033 (octal) instead.
PASSED=$(printf '\033[32mPASSED\033[0m')
printf '[ %s ] some test\n' "$PASSED"

【讨论】:

    【解决方案2】:

    您希望 bash 解释反斜杠字符。在 printf 中使用 %b 而不是 %s。因此,您应该拥有以下内容。

    printf "[ %b ] %s distribution detected. Validated as supported by this script.\n" $PASSED $LINUX_DISTRO
    

    另外,我修改了你的变量。

    PASSED="\e[00;32mPASSED\e[0m"
    

    【讨论】:

    • 谢谢!我不知道%b,这解决了问题。
    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2012-06-12
    相关资源
    最近更新 更多