这是我打印彩色文本的函数:
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
迈克尔的回答正确地指出,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"