2

グローバル変数があります

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変数を再利用する方法

4

2 に答える 2

3

簡単な答え: できません。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

また、スクリプトからいくつか変更しました。

  • 小文字の変数名を使用 (bash では大文字の変数名を使用することは悪い習慣と見なされるため)、
  • $'...'正しい色にするために使用します (文字列の代わりに"\e[m"、...)、
  • bash で関数を定義する適切な方法を使用しました (キーワードなし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

于 2012-11-30T16:49:34.577 に答える
1

${FG}TITLE は、使用するときではなく、入力する場所を含むように拡張されます。1つの解決策は次のとおりです。

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

それから

eval printf "$TITLE" "One"
于 2012-11-30T16:42:17.227 に答える