これはカラーテキストを印刷する機能です。
cecho()
{
color=${1:-""} # defaults to original color if no color specified
colorreset="\E[0m" # back to black after function return
while read line; do
echo -e "$color$line$colorreset"
done
return
}
$ blue="\E[34m"
$ echo "message" | cecho $blue
$ message # it appears in blue
ただし、-nオプションを使用すると何も印刷されません。
$ echo -n "message" | cecho $blue
$
「-n」オプションが必要なのは、印刷するテキストに行全体のカラーワードのみが含まれているためです。たとえば、次のようになります。
$ echo -n "this is "
$ echo "blue" | cecho $blue
答え1
あなたの問題は、「読み取り」が入力を読むために行末が必要であるという事実に関連していると思います。したがって、一部の入力が提供されるまで(つまり永久に)停止します。
たぶん、cechoに '-n'オプションを追加する必要があります。
$ echo "message | cecho -n $blue
-n
その後、関数を書き直して「」を確認し、echo
内部に適用しますcecho
。
答え2
Michaelの答えは、read
読んでいるデータの末尾に改行文字がないので何も返されないと正しく明示しています。while
次のように条件を変更すると、これを防ぐことができます。
while read line || [ -n "$line" ];
答え3
必要なものを達成するには、次のようにします。
#!/bin/bash
cecho()
{
color="${1:-""}"
colorreset=$(tput sgr0) # back to black after function return
while read line; do
if [[ ! -n $color ]]; then
printf '%s\n' "$line $colorreset"
else
printf '%s\n' "$1$line $colorreset"
fi
done
return
}
cecho "$1"