グローバル変数があります
RT="\e[m"
TITLE="${FG}%s${RT}"
そして2つの機能を持っています
function one
{
local FG="\e[33m"
printf "$TITLE" "One"
}
function two
{
local FG="\e[32m"
printf "$TITLE" "Two"
}
しかし、色は変わりません。$TITLE
変数を再利用する方法
簡単な答え: できません。bash にはポインターに相当するものはありません。変数$TITLE
は代入文字の右辺の展開で代入されるため、 は展開時に定義されていないため、空の文字列に展開され$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"
毎回入力しなければならないことに本当に困っていることが分かります。ここに別の可能性があります: variable を定義する代わりに、フォーマット文字列をエコー$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
${FG}
TITLE は、使用するときではなく、入力する場所を含むように拡張されます。1つの解決策は次のとおりです。
TITLE='${FG}%s${RT}'
それから
eval printf "$TITLE" "One"