4

diff を使用して tput カラー変数を含む文字列をフォーマットしていますが、「悪eval コマンドを使用せずにこれらの変数を評価することはできません。

文字列を作成するコマンド:

output1="$(diff --changed-group-format="\${RED}%=\${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n')"

これを出力します:

[String n${RED}â${CLS}m${RED}è™${CLS}]

私は他の答えを見て検索しましたが、次のもの以外は何も機能していません:

eval echo "${output1}"

私が読んだことから、私の3つのオプションはeval悪い)、間接展開(良い)、および配列(最高)です。間接化の試みはすべて失敗しました。配列オプションを使用したいのですが、ここでどのように適用されるかわかりません。何か不足していますか?

関連性はないと思いますが、変数と diff に送信される文字列の構成は、別の質問here にあります

4

1 に答える 1

1

有限で既知のカラーコードのセットを使用する場合は、Bash パラメーター拡張を使用できます。

#!/usr/bin/env bash

# Define the variables containing ANSI color sequences.
RED="$(tput setaf 1)"
CYA="$(tput setaf 6)"
CLS="$(tput sgr0)"

# Sample input string
str='[String n${RED}â${CLS}m${CYA}è™${CLS}]'

# Replace the placeholders with their corresponding variable values.
str=${str//'${RED}'/${RED}}
str=${str//'${CYA}'/${CYA}}
str=${str//'${CLS}'/${CLS}}

# Output the result.
echo "$str"

このアプローチは、単一引用符で囲まれていない限り、Bash パラメーター展開で使用される引数自体が展開されるという事実を利用しています。

  • ${<varName>//<search>/<replace>}variable の値のすべてのインスタンスを<search>withに置き換えます。<replace><varName>
  • '${RED}'たとえば、 -シングルクォーテーションで囲まれているため- は文字通りの検索語と見なされます。
  • ${RED}たとえば、引用符で囲まれていないため、置換用語として使用される前に展開されるため、リテラルが variable の値に効果的置き換え ${RED}られます ${RED}

関数にラップ:

printColored() {
  local str=$1
  local RED="$(tput setaf 1)" CYA="$(tput setaf 6)" CLS="$(tput sgr0)"
  str=${str//'${RED}'/${RED}}
  str=${str//'${CYA}'/${CYA}}
  str=${str//'${CLS}'/${CLS}}
  printf '%s\n' "$str"
}

printColored '[String n${RED}â${CLS}m${CYA}è™${CLS}]'

ちなみに、「cls」という用語は画面全体をクリアすることを示唆しているため、(「リセット」の場合)または同様の名前に変更${CLS}します。${RST}

于 2015-12-21T00:12:07.673 に答える