我有一个全局变量
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/