我有一个全局变量
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
变量
答案 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
是邪恶的!
我还修改了你脚本中的一些内容:
$'...'
获得正确的颜色(而不是字符串"\e[m"
,...),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"