Bashスクリプトでメッセージを印刷していますが、その一部を着色したいと思います。
#!/bin/bash
normal='\e[0m'
yellow='\e[33m'
cat <<- EOF
${yellow}Warning:${normal} This script repo is currently located in:
[ more messages... ]
EOF
tmux
ただし、端末で(内部的にgnome-terminal
)実行するときANSIエスケープ文字\
たとえば、表形式で印刷してみてください。
\e[33mWarning\e[0m This scr....
色分けしたい部分をprintf
ここのドキュメントの外側のコマンドに移動すると機能します。たとえば、次のように動作します。
printf "${yellow}Warning:${normal}"
cat <<- EOF
This script repo is currently located in:
[ more messages... ]
EOF
ソースman bash
– このドキュメント:
パラメーターおよび変数拡張、コマンド置換、算術拡張、またはパス名拡張は実行されません。言葉。その中に文字があれば言葉引用されたので区切り記号引用符を削除した結果です。言葉、ここのドキュメントの行は拡張されません。もし言葉引用符がない場合、この文書のすべての行にはパラメータ拡張、コマンド置換、および算術拡張があります。後者の場合、文字の順序は次のとおりです。\<改行>無視され、文字とを引用するために
\
使用する必要があります\
。$
`
これがANSIエスケープコードにどのような影響を与えるかわかりません。cat
ここに記載されているBashドキュメントでANSIエスケープコードを使用できますか?
答え1
スクリプトでは、これらの操作は
normal='\e[0m'
yellow='\e[33m'
その文字を入れて文字通り変数として、つまり\e[0mエスケープシーケンスの代わりに。たとえば、printf
構文エスケープ文字(またはその一部のバージョン)を使用できます。echo
normal=$(printf '\033[0m')
yellow=$(printf '\033[33m')
tput
ただし、正しく設定された端末で動作するため、使用する方が良いでしょう。
normal=$(tput sgr0)
yellow=$(tput setaf 3)
printf
あなたの例を見ると、エスケープ文字バージョンとして処理を使用しているようです\e
(これはシステムで動作することができますが、通常は他のシステムに移植することはできません)。これを見るには、以下を試してください。
yellow='\e[33m'
printf 'Yellow:%s\n' $yellow
あなたは見るでしょう言葉数値:
Yellow:\e[33m
エスケープシーケンスの代わりに。それらをprintf
形式にしてprintf
(可能であれば)私たちに解釈するように教えてください。
追加資料:
答え2
この割り当ては変数にエスケープ文字を配置しません。
normal='\e[0m' yellow='\e[33m'
これを行うには、echo -e
printf
または$'...'
(bashで)が必要です。
bashを使用しているので、次のものも使用できます。
normal=$'\e[0m' yellow=$'\e[33m'
$
前に文字列を書き留めます'\e[0m'
。
しかし、エスケープ文字を取得する移植可能な方法は、以下のようにprintfです。
normal="$(printf '\033[0m')" yellow="$(printf '\033[33m')"
エスケープ文字(033)の8進数値は、すべてのPOSIXシェルで有効です。