bash - 在 bash 中重用字符串

标签 bash printf

我有一个全局变量

RT="\e[m"
TITLE="${FG}%s${RT}"

有两个功能

function one
{
   local FG="\e[33m"
   printf "$TITLE" "One"
}

function two
{
   local FG="\e[32m"
   printf "$TITLE" "Two"
}

但是颜色没有改变,如何重用$TITLE变量

最佳答案

简短的回答:你不能,bash 没有相当于指针的东西。变量 $TITLE 是通过赋值字符的 rhs 扩展来赋值的,因此 $TITLE 的值为 %s\e[m由于 $FG 在扩展时未定义,因此扩展为空字符串。作为解决方法,您可以这样做:

rt=$'\e[m'
title="%s%s$rt"

one() {
    local fg=$'\e[33m'
    printf "$title" "$fg" "One"
}

two() {
    local fg=$'\e[32m'
    printf "$title" "$fg" "Two"
}

使用 eval 并不是一个好的选择,因为 eval 是邪恶的!

我还修改了您的脚本中的一些内容:

  • 使用小写变量名(因为在 bash 中使用大写变量名被认为是不好的做法),
  • 使用 $'...' 获得正确的颜色(而不是字符串 "\e[m", ...),
  • 使用正确的方式在 bash 中定义函数(不使用关键字 function)。

编辑。从您的评论中,我发现您对每次都必须输入 "$fg" 感到非常困扰。因此,这是另一种可能性:定义一个函数 title 来回显格式化字符串并像这样使用它,而不是定义变量 $title:

rt=$'\e[m'

title() {
   echo "$fg%s$rt"
}

one() {
    local fg=$'\e[33m'
    printf "$(title)" "One"
}

two() {
    local fg=$'\e[32m'
    printf "$(title)" "Two"
}

每次调用函数标题时,它都会回显您需要的格式化字符串,因此 $(title) 将扩展为该格式化字符串。每次调用函数 title 时,字符串 "$fg%s$rt" 都会展开,变量 $fg$rt 在这个扩展时间。

关于bash - 在 bash 中重用字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649299/

相关文章:

c - 为什么 printf() 是一个不纯的函数?

Bash 脚本参数

linux - 这个sed命令是什么意思? sed 's%^.*/%%'

gcc - printf 编译器优化?在堆栈上的 gdb 中找不到 "%s"个字符

c - sprintf 函数的缓冲区溢出?

c++ - 使用 ' ios::sync_with_stdio(0)' 测试运行时差异时,为什么我的输出是零散的?

c - 返回参数不起作用 - 给我一个奇怪的错误

BASH - 在系统内部使用 awk 列

bash - 不在 git 存储库中时无法抑制 git 分支错误

linux - 参数扩展