有限で既知のカラーコードのセットを使用する場合は、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}