在bash中重用字符串

时间:2012-11-30 16:36:39

标签: 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变量

2 个答案:

答案 0 :(得分:3)

简短的回答:你不能,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在此展开时的任何值。

答案 1 :(得分:1)

TITLE已扩展为包含您键入的${FG},而不是在您使用它时。一个解决方案是:

TITLE='${FG}%s${RT}'

然后

eval printf "$TITLE" "One"