为了命令行输出更加有辨识度,shell脚本需要对输出进行格式化。例如,借助escape序列,设定文字的颜色;通过其他ascii控制字符\r,\b等,控制文字的输出,等等。
Escape序列
escape序列是一个相当古老的ANSI标准,基本所有的Unix/Linux terminal都支持escape序列。escape序列以八进制\033即ESC的ASCII码开头,主要用来控制字体的颜色和其他特征如闪烁,下划线等。例如
- 表示粗体是 \033[1m
- 表示字体黄色是 \033[33m
- 表示红色背景是 \033[41m
举例1
- tput cols 发现当前terminal的列数。tput工具设置或查询terminal的信息。
- \e[32m 设置文字绿色。\e[31m 设置文字红色。\e[6C 光标向前跳过6个字符。
echo支持-e选项,\033可写作\e。
#!/bin/bash print_header() { local cols=$(tput cols) local word=">>> $1 <<<" local skip=6 echo -n -e "\e[32m" local x; for ((x=0; $x<$cols; x++)); do echo -n "~" done echo -e "\r\e[${skip}C\e[31m${word}\n\b\e[0m" } print_header "第一步" echo "some ..." print_header "第二步" echo "another ..."
运行结果如下
举例2
#!/bin/bash
print_header() {
local width=$(tput cols)
local word=">>> $1 <<<"
local skip=4
local x=0
echo -n -e "\e[32;4m"
while (($x < 2 * $width)); do
echo -n " "
((x++))
[[ $x == $width ]] && echo
done
echo -e "\r\e[${skip}C${word}\n\b\e[0m"
}
print_header "第一步"
echo "some ..."
print_header "第二步"
echo "another ..."
运行结果如图所示