怎样用ansic 转义序列列 改变提示符位置

ANSI.SYS程序的使用方法_DOS/BAT
作者:用户
本文讲的是ANSI.SYS程序的使用方法_DOS/BAT,
ANSI.SYS是MS-DOS中一个很有用的设备驱动程序利用它我们可以取得意想不到的显示效果。那么它该如何使用呢下面就来介绍一下。
注意在本节中语法和 ANSI 转义序列中的大写字母必须按原样键入。
ANSI.SYS 定义了一系列函数这些
ANSI.SYS是MS-DOS中一个很有用的设备驱动程序利用它我们可以取得意想不到的显示效果。那么它该如何使用呢下面就来介绍一下。
注意在本节中语法和 ANSI 转义序列中的大写字母必须按原样键入。
ANSI.SYS 定义了一系列函数这些函数被用来改变显示图形、控制光标移动和键的重定义ANSI.SYS 设备驱动程序支持转义序列的 ANSI 终端仿真以便控制系统的屏幕和键盘。
该设备驱动程序必须由位于 CONFIG.SYS 文件中的DEVICE或DEVICEHIGH命令加载。
DEVICE(HIGH)=[ 驱动器 :][ 路径 ]ANSI.SYS [/X] [/K] [/R]
[ 驱动器 :][ 路径 ]
指定 ANSI.SYS 文件的位置。
重新映射 101 键键盘以外的扩展键。
使 ANSI.SYS 文件将 101 键键盘当作 84 键键盘看待这等价于命令 SWITCHES=/K。如果您通常使用 SWITCHES=/K命令那么在使用ANSI.SYS 时则需要使用选项 /K。
当 ANSI.SYS 与屏幕阅读程序该程序使残疾人更易于使用机一起使用时此选项用来调整行的滚动以便提高可读性。
在 ANSI 转义序列中使用的参数
数字参数用来指定一个十进制数。
可选参数。指定一个十进制数用于选择函数。您可以指定多个函数必须用分号 (;) 将参数隔开。
行参数。指定一个十进制数它代表显示器或其它设备上的一行。
列参数。指定一个十进制数它代表屏幕或其它设备上的一列。
ANSI 转义序列中关于光标移动、图形和键盘的设置
在下面的 ANSI 转义序列的中缩写 ESC 代表 ASCII转义字符 27(1Bh)它位于每个转义序列的开始。
ESC[PL;PcH
光标位置移动光标到指定的位置坐标如果不指定位置光标将移动到起始位置即屏幕的左上角0 行0 列。
该转义序列与下面的光标位置转义序列的工作方式相同。
ESC[PL;Pcf
光标位置与前面光标位置转义序列的工作方式相同。
上移光标不改变列而将光标向上移动指定的行数。如果光标已在首行则 ANSI.SYS 忽略这个序列。
下移光标不改变列而将光标向下移动指定的行数。如果光标已经在最后一行则 ANSI.SYS 忽略这个序列。
右移光标不改变行而将光标向右移动指定的列数。如果光标已经在最右列则 ANSI.SYS 忽略这个序列。
左移光标不改变行而将光标向左移动指定的列数。如果光标已经在最左列则 ANSI.SYS 忽略这个序列。
保存光标位置保存当前光标位置。使用“恢复光标位置”序列您可以将光标移动到保存的光标位置。
恢复光标位置将光标位置返回到“保存光标位置”所储存的位置。
清除显示清除屏幕并将光标位置移到起始位置0 行0 列。
清除行清除从光标所在位置到行尾的所有字符( 包括光标位置上的字符)。
ESC[Ps;...;Psm
设置图形模式调用由下列数值指定的图形函数在该序列再次出现之前这些被指定的函数保持激活状态。图形模式改变屏幕上显示的颜色和文本例如黑体和下划线字体属性。
------------------------------------
4 下划线字体仅适用于单色显示适配器
5 闪烁字体
7 反显字体
8 隐藏字体
------------------------------------
------------------------------------
参数 30 到 47 符合 ISO 6429 标准。
设置模式改变屏幕宽度或类型使之成为下列数值所指定的一种。
0 40 x 148 x 25 单色文本
1 40 x 148 x 25 彩色文本
2 80 x 148 x 25 单色文本
3 80 x 148 x 25 彩色文本
4 320 x 148 x 200 4 色图形
5 320 x 148 x 200 单色图形
6 640 x 148 x 200 单色图形
7 启用换行功能
13 320 x 148 x 200 彩色图形
14 640 x 148 x 200 彩色16 色图形
15 640 x 148 x 350 单色2 色图形
16 640 x 148 x 350 彩色16 色图形
17 640 x 148 x 480 单色2 色图形
18 640 x 148 x 480 彩色16 色图形
19 320 x 148 x 200 彩色256 色图形
重新设置模式使用“设置模式”序列所用的同一值来重新设置模式但是 7 除外使用 7 将使换行功能失效。
注意该转义序列中的最后一个字符是个小写 L。
设置键盘字符串将键盘键重新定义为指定的字符串。该转义序列的参数定义如下
“code”是列于下表的一个或多个数值这些数值代表键盘键和键的组合。当在命令中使用这些数值时除了该序列要求的分号外您还必须键入该表中显示的分号。括号中的代码在一些键盘上不存在除非选项 /X 在 ANSI.SYS 的DEVICE 命令中被指定否则ANSI.SYS 将不为这些键盘翻译括号中的代码。
“string”对于单个字符是 ASCII 代码或者是包含在引号中的串。例如65 和“A”都被用来代表大写字母 A。
要点下表中的一些值并不是对于所有的计算机都有效对于那些不同的数值请检查您的计算机。
键代码 SHIFT+ 代码 CTRL+ 代码 ALT+ 代码
------------------------------------------------------------------
通常,在DOS提示符下按ESC键时,屏幕会显示一个反斜杠(\)并把光标移到下一行.这时可以使用PROMPT命令.假如现在DOS提示符是$P$G,想要清屏,就可键入: PROMPT=$E[2J $P$G 这里$E即表示按ESC键,然后再把提示符改回$P$G,不然在执行每条命令前就都要清屏了.
在用EDIT编辑批处理文件时可用下列方法输入ESC字符.首先同时按下Ctrl和P键 然后再按下作方括号,此时屏幕出现一左箭头(?说明已输入了ESC字符.之后必须放 开Ctrl再次按下方括号键开始ANSI命令.
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ansi.sys、sysconfig.bat、dos执行bat、dos bat 语法、dos bat,以便于您获取更多的相关知识。
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
ansi.sys、sysconfig.bat、dos执行bat、dos bat 语法、dos bat的信息
,所有相关内容均不代表云栖社区的意见!关于CMD显示彩色文字【批处理吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,003贴子:
关于CMD显示彩色文字收藏
@echo offchcp 437&nul&&graftabl 936&nulif not exist CONFIG.NT copy %WinDir%\System32\CONFIG.NT CONFIG.NT@clsecho DEVICE=%WinDir%\System32\ANSI.SYS /x &%WinDir%\System32\CONFIG.NT@echo.command /cecho command /cecho &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 登鹳雀楼@echo.@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&&& 白日依山尽,黄河入海流。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&&& 欲穷千里目,更上一层楼。@echo.@echo.@echo.@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 下江陵@echo.@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&& 朝辞白帝彩云间,千里江陵一日还。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&& 两岸猿声啼不住,轻舟已过万重山。@echo.@echo.@echo&& 继续下页pause&nul@cls@echo.@echo.@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 关山月@echo.@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&& 明月出天山,苍茫云海间。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&& 长风几万里,吹度玉门关。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&& 汉下白登道,胡窥青海湾。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&& 由来征战地,不见有人还。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&& 戍客望边色,思归多苦颜。@echo.command /cecho &&&&&&&&&&&&&&&&&&&&&&&&& 高楼当此夜,叹息未应闲。@echo.@echo.pause&nulcopy&& CONFIG.NT&& %WinDir%\System32\CONFIG.NTcopy&& CONFIG.NT&& %WinDir%\System32\CONFIG.NTdel&& CONFIG.NTexit
基恩士全球标准CV-X系列视觉系统,任何人皆可使用精密算法,皆可实现快速后动和长期运用,基恩士还有丰富的图像处理产品阵容可满足您的多样要求!详情请点击
ANSI.SYS不错.顶下
快试试吧,可以对自己使用挽尊卡咯~◆◆
能不能讲一下原理啊,谢谢!
ansi.sys 查这个就知道相关命令了
晕、、win7没command
今天把系统换成Win7了。。。确实没有。。。
今天又研究了一下,在Win7下必须要用管理员身份运行。。。否则不行。。
我是win7啊,可以用啊
呃。。。我想请教一下各位高手,最近只要运行批处理文件都会出现一个错误对话框,内容大概是这样的“Windows 命令处理程序 已停止工作”“Windows 正在检查该问题的解决方案”,请问这是什么原因?先说明一下,XP和Win7都试过,均发现类似问题(新装了一个XP试验)绝对不是病毒我怀疑是微软的更新补丁导致的 请问各位高手,该如何解决?
江苏贝尔照明专注太阳能路灯22年,注重品质,售后完善
什么??Windows7不支持cmd????杯具...
windows7支持啊,他们指的是而不是cmd.exe
为什么显示彩色?希望有人解释下。谢谢!
ANSI.SYS是MS-DOS中一个很有用的设备驱动程序,利用它,我们可以取得意想不到的显示效果。那么,它该如何使用呢?下面就来介绍一下。 注意:在本节中,语法和 ANSI 转义序列中的大写字母必须按原样键入。 ANSI.SYS 定义了一系列函数,这些函数被用来改变显示图形、控制光标移动和键的重定义,ANSI.SYS 设备驱动程序支持转义序列的 ANSI 终端仿真,以便控制系统的屏幕和键盘。 该设备驱动程序必须由位于 CONFIG.SYS 文件中的DEVICE或DEVICEHIGH命令加载。 语法 DEVICE(HIGH)=[ 驱动器 :][ 路径 ]ANSI.SYS [/X] [/K] [/R] 参数 [ 驱动器 :][ 路径 ] 指定 ANSI.SYS 文件的位置。 选项 /X 重新映射 101 键键盘以外的扩展键。 /K 使 ANSI.SYS 文件将 101 键键盘当作 84 键键盘看待,这等价于命令 SWITCHES=/K。如果您通常使用 SWITCHES=/K命令,那么在使用ANSI.SYS 时,则需要使用选项 /K。 /R 当 ANSI.SYS 与屏幕阅读程序(该程序使残疾人更易于使用计算机)一起使用时,此选项用来调整行的滚动,以便提高可读性。 在 ANSI 转义序列中使用的参数: 数字参数,用来指定一个十进制数。 可选参数。指定一个十进制数,用于选择函数。您可以指定多个函数,必须用分号 (;) 将参数隔开。 PL 行参数。指定一个十进制数,它代表显示器或其它设备上的一行。 Pc 列参数。指定一个十进制数,它代表屏幕或其它设备上的一列。 ANSI 转义序列中关于光标移动、图形和键盘的设置: 在下面的 ANSI 转义序列的列表中,缩写 ESC 代表 ASCII转义字符 27(1Bh),它位于每个转义序列的开始。 ESC[PL;PcH 光标位置:移动光标到指定的位置(坐标),如果不指定位置,光标将移动到起始位置,即屏幕的左上角(0 行,0 列)。 该转义序列与下面的光标位置转义序列的工作方式相同。 ESC[PL;Pcf 光标位置:与前面光标位置转义序列的工作方式相同。 ESC[PnA 上移光标:不改变列而将光标向上移动指定的行数。如果光标已在首行,则 ANSI.SYS 忽略这个序列。 ESC[PnB 下移光标:不改变列而将光标向下移动指定的行数。如果光标已经在最后一行,则 ANSI.SYS 忽略这个序列。 ESC[PnC 右移光标:不改变行而将光标向右移动指定的列数。如果光标已经在最右列,则 ANSI.SYS 忽略这个序列。 ESC[PnD 左移光标:不改变行而将光标向左移动指定的列数。如果光标已经在最左列,则 ANSI.SYS 忽略这个序列。 ESC[s 保存光标位置:保存当前光标位置。使用“恢复光标位置”序列,您可以将光标移动到保存的光标位置。 ESC[u 恢复光标位置:将光标位置返回到“保存光标位置”所储存的位置。 ESC[2J 清除显示:清除屏幕并将光标位置移到起始位置(0 行,0 列)。 ESC[K 清除行:清除从光标所在位置到行尾的所有字符( 包括光标位置上的字符)。 ESC[Ps;...;Psm 设置图形模式:调用由下列数值指定的图形函数,在该序列再次出现之前,这些被指定的函数保持激活状态。图形模式改变屏幕上显示的颜色和文本(例如:黑体和下划线字体)属性。 文本属性 值功能 ------------------------------------ 0 无属性 1 黑体 4 下划线字体(仅适用于单色显示适配器) 5 闪烁字体 7 反显字体 8 隐藏字体 前景色 值功能 ------------------------------------ 30 黑色 31 红色 32 绿色 33 黄色 34 蓝色 35 紫红色 36 青色 37 白色 背景色 值功能 ------------------------------------ 40 黑色 41 红色 42 绿色 43 黄色 44 蓝色 45 紫红色 46 青色 47 白色
谢楼上有了这个就可以做一个自己的、带语法高亮的编辑器了
看着有点晕!汗……看来还得加油!
楼主果然是强人。。
用findstr也可以实现 不过 一样 特殊字符(用debug辅助输出吧) 哎这个是老帖了
回家试试看
回复10楼,是不是组策略禁用CMD了·看下!
这个早就看过了,没有……后来发现只要重定向到空设备(即nul)就会出错,我百思不得其解,望各位指教……
快试试吧,可以对自己使用挽尊卡咯~◆◆
还行,不错
无忧的老教程了&&
呵呵, 楼主花心了
color貌似也不错单调了点- -兰州这个中
快试试吧,可以对自己使用挽尊卡咯~◆◆
21L,有实例吗?谢!
ANSI.SYS是MS-DOS中一个很有用的设备驱动程序,利用它,我们可以取得意想不到的显示效果。那么,它该如何使用呢?下面就来介绍一下。 注意:在本节中,语法和 ANSI 转义序列中的大写字母必须按原样键入。 ANSI.SYS 定义了一系列函数,这些函数被用来改变显示图形、控制光标移动和键的重定义,ANSI.SYS 设备驱动程序支持转义序列的 ANSI 终端仿真,以便控制系统的屏幕和键盘。 该设备驱动程序必须由位于 CONFIG.SYS 文件中的DEVICE或DEVICEHIGH命令加载。 语法 DEVICE(HIGH)=[ 驱动器 :][ 路径 ]ANSI.SYS [/X] [/K] [/R] 参数 [ 驱动器 :][ 路径 ] 指定 ANSI.SYS 文件的位置。 选项 /X 重新映射 101 键键盘以外的扩展键。 /K 使 ANSI.SYS 文件将 101 键键盘当作 84 键键盘看待,这等价于命令 SWITCHES=/K。如果您通常使用 SWITCHES=/K命令,那么在使用ANSI.SYS 时,则需要使用选项 /K。 /R 当 ANSI.SYS 与屏幕阅读程序(该程序使残疾人更易于使用计算机)一起使用时,此选项用来调整行的滚动,以便提高可读性。 在 ANSI 转义序列中使用的参数: 数字参数,用来指定一个十进制数。 可选参数。指定一个十进制数,用于选择函数。您可以指定多个函数,必须用分号 (;) 将参数隔开。 PL 行参数。指定一个十进制数,它代表显示器或其它设备上的一行。 Pc 列参数。指定一个十进制数,它代表屏幕或其它设备上的一列。 ANSI 转义序列中关于光标移动、图形和键盘的设置: 在下面的 ANSI 转义序列的列表中,缩写 ESC 代表 ASCII转义字符 27(1Bh),它位于每个转义序列的开始。 ESC[PL;PcH 光标位置:移动光标到指定的位置(坐标),如果不指定位置,光标将移动到起始位置,即屏幕的左上角(0 行,0 列)。 该转义序列与下面的光标位置转义序列的工作方式相同。 ESC[PL;Pcf 光标位置:与前面光标位置转义序列的工作方式相同。 ESC[PnA 上移光标:不改变列而将光标向上移动指定的行数。如果光标已在首行,则 ANSI.SYS 忽略这个序列。 ESC[PnB 下移光标:不改变列而将光标向下移动指定的行数。如果光标已经在最后一行,则 ANSI.SYS 忽略这个序列。 ESC[PnC 右移光标:不改变行而将光标向右移动指定的列数。如果光标已经在最右列,则 ANSI.SYS 忽略这个序列。 ESC[PnD 左移光标:不改变行而将光标向左移动指定的列数。如果光标已经在最左列,则 ANSI.SYS 忽略这个序列。 ESC[s 保存光标位置:保存当前光标位置。使用“恢复光标位置”序列,您可以将光标移动到保存的光标位置。 ESC[u 恢复光标位置:将光标位置返回到“保存光标位置”所储存的位置。 ESC[2J 清除显示:清除屏幕并将光标位置移到起始位置(0 行,0 列)。 ESC[K 清除行:清除从光标所在位置到行尾的所有字符( 包括光标位置上的字符)。 ESC[Ps;...;Psm 设置图形模式:调用由下列数值指定的图形函数,在该序列再次出现之前,这些被指定的函数保持激活状态。图形模式改变屏幕上显示的颜色和文本(例如:黑体和下划线字体)属性。 文本属性 值功能 ------------------------------------ 0 无属性 1 黑体 4 下划线字体(仅适用于单色显示适配器) 5 闪烁字体 7 反显字体 8 隐藏字体 前景色 值功能 ------------------------------------ 30 黑色 31 红色 32 绿色 33 黄色 34 蓝色 35 紫红色 36 青色 37 白色 背景色 值功能 ------------------------------------ 40 黑色 41 红色 42 绿色 43 黄色 44 蓝色 45 紫红色 46 青色 47 白色
非常 牛 B 的批处理 命令
登录百度帐号推荐应用ANSIC语言中全部转义字符(doc 19页)_ANSI_精品资料网
您现在的位置:&&>>&&>>&&>>&&>>&资料信息
ANSIC语言中全部转义字符(doc 19页)
所属分类:
文件大小:
下载地址:
相关资料:
ANSIC语言中全部转义字符(doc&19页)内容简介
ANSIC语言中全部转义字符目录:A1、声明、定义、函数原形、函数定义、函数体A2、ANSI C语言中全部转义字符A3、运算符优先级与结合性A4、Shell排序法A5、函数的递归A6、头文件―C预处理器A7、输入与输出A8、UNIX系统接口A9、库..............................
ANSIC语言中全部转义字符(doc&19页)简介结束,下载后阅读全部内容Colorizing ScriptsAdvanced Bash-Scripting Guide: An in-depth exploration of the art of shell scriptingPrevChapter 33. MiscellanyNext
33.5. 彩色脚本
定义了屏幕属性的转义序列集合,例如粗体文本,背景和前景颜色. DOS批处理文件(batch files) 一般使用ANSI的转义代码来控制色彩输出,Bash脚本也是这么做的.
例子 33-11. 一个 "彩色的" 地址资料库
1&#!/bin/bash
2&# ex30a.sh: ex30.sh的"彩色" 版本.
没有加工处理的地址资料库
# 清除屏幕.
8&echo -n "
9&echo -e '\E[37;44m'"\033[1mContact List\033[0m"
# 白色为前景色,蓝色为背景色
12&echo -e "\033[1mChoose one of the following persons:\033[0m"
14&tput sgr0
15&echo "(Enter only the first letter of name.)"
17&echo -en '\E[47;34m'"\033[1mE\033[0m"
18&tput sgr0
# 把色彩设置为"常规"
19&echo "vans, Roland"
# "[E]vans, Roland"
20&echo -en '\E[47;35m'"\033[1mJ\033[0m"
21&tput sgr0
22&echo "ones, Mildred"
23&echo -en '\E[47;32m'"\033[1mS\033[0m"
24&tput sgr0
25&echo "mith, Julie"
26&echo -en '\E[47;31m'"\033[1mZ\033[0m"
27&tput sgr0
28&echo "ane, Morris"
31&read person
33&case "$person" in
34&# 注意变量被引起来了.
"E" | "e" )
# 接受大小写的输入.
echo "Roland Evans"
echo "4321 Floppy Dr."
echo "Hardscrabble, CO 80753"
echo "(303) 734-9874"
echo "(303) 734-9892 fax"
echo "Business partner & old friend"
"J" | "j" )
echo "Mildred Jones"
echo "249 E. 7th St., Apt. 19"
echo "New York, NY 10009"
echo "(212) 533-2814"
echo "(212) 533-9972 fax"
echo "Girlfriend"
echo "Birthday: Feb. 11"
60&# 稍后为 Smith 和 Zane 增加信息.
# 默认选项Default option.
# 空的输入(直接按了回车) 也会匹配这儿.
echo "Not yet in database."
71&tput sgr0
# 把色彩重设为"常规".
例子 33-12. 画盒子
1&#!/bin/bash
2&# Draw-box.sh: 用ASCII字符画一个盒子.
4&# Stefano Palmeri编写,文档作者作了少量编辑.
5&# 征得作者同意在本书使用.
8&######################################################################
draw_box 函数的注释
"draw_box" 函数使用户可以在终端上画一个盒子.
用法: draw_box ROW COLUMN HEIGHT WIDTH [COLOR]
ROW 和 COLUMN 定位要画的盒子的左上角.
ROW 和 COLUMN 必须要大于0且小于目前终端的尺寸.
HEIGHT 是盒子的行数,必须 > 0.
HEIGHT + ROW 必须 <= 终端的高度.
WIDTH 是盒子的列数,必须 > 0.
WIDTH + COLUMN 必须 <= 终端的宽度.
例如: 如果你当前终端的尺寸是 20x80,
draw_box 2 3 10 45 是合法的
draw_box 2 3 19 45 的 HEIGHT 值是错的 (19+2 > 20)
draw_box 2 3 18 78 的 WIDTH 值是错的 (78+3 > 80)
COLOR 是盒子边框的颜色.
它是第5个参数,并且它是可选的.
0=黑色 1=红色 2=绿色 3=棕褐色 4=蓝色 5=紫色 6=青色 7=白色.
如果你传给这个函数错的参数,
33&#+ 它就会以代码65退出,
34&#+ 没有其他的信息打印到标准出错上.
在画盒子之前要清屏.
函数内不包含有清屏命令.
这使用户可以画多个盒子,甚至叠接多个盒子.
draw_box 函数注释结束
41&######################################################################
43&draw_box(){
45&#=============#
46&HORZ="-"
47&VERT="|"
48&CORNER_CHAR="+"
50&MINARGS=4
51&E_BADARGS=65
52&#=============#
55&if [ $# -lt "$MINARGS" ]; then
# 如果参数小于4,退出.
exit $E_BADARGS
59&# 搜寻参数中的非数字的字符.
60&# 能用其他更好的办法吗 (留给读者的练习?).
61&if echo $@ | tr -d [:blank:] | tr -d [:digit:] | grep . &> /dev/ then
exit $E_BADARGS
65&BOX_HEIGHT=`expr $3 - 1`
-1 是需要的,因为因为边角的"+"是高和宽共有的部分.
66&BOX_WIDTH=`expr $4 - 1`
67&T_ROWS=`tput lines`
定义当前终端长和宽的尺寸,
68&T_COLS=`tput cols`
70&if [ $1 -lt 1 ] || [ $1 -gt $T_ROWS ]; then
如果参数是数字就开始检查有效性.
exit $E_BADARGS
73&if [ $2 -lt 1 ] || [ $2 -gt $T_COLS ]; then
exit $E_BADARGS
76&if [ `expr $1 + $BOX_HEIGHT + 1` -gt $T_ROWS ]; then
exit $E_BADARGS
79&if [ `expr $2 + $BOX_WIDTH + 1` -gt $T_COLS ]; then
exit $E_BADARGS
82&if [ $3 -lt 1 ] || [ $4 -lt 1 ]; then
exit $E_BADARGS
# 参数检查完毕.
86&plot_char(){
# 函数内的函数.
echo -e "\E[${1};${2}H"$3
90&echo -ne "\E[3${5}m"
# 如果传递了盒子边框颜色参数,则设置它.
92&# start drawing the box
94&count=1
用plot_char函数画垂直线
95&for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
100&count=1
101&c=`expr $2 + $BOX_WIDTH`
102&for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
107&count=1
用plot_char函数画水平线
108&for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
113&count=1
114&r=`expr $1 + $BOX_HEIGHT`
115&for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
120&plot_char $1 $2 $CORNER_CHAR
# 画盒子的角.
121&plot_char $1 `expr $2 + $BOX_WIDTH` +
122&plot_char `expr $1 + $BOX_HEIGHT` $2 +
123&plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` +
125&echo -ne "\E[0m"
恢复最初的颜色.
127&P_ROWS=`expr $T_ROWS - 1`
在终端的底部打印提示符.
129&echo -e "\E[${P_ROWS};1H"
133&# 现在, 让我们来画一个盒子.
# 颜色(红)
140&draw_box $R $C $H $W $col
142&exit 0
144&# 练习:
145&# --------
146&# 增加可以在盒子里打印文本的选项
最简单也可能是最有用的ANSI转义序列是加粗文本, \033[1m ... \033[0m. \033 触发转义序列,
而 "[1" 启用加粗属性, 而"[0" 表示切换回禁用加粗状态. "m"则表示终止一个转义序列.
bash$ echo -e "\033[1mThis is bold text.\033[0m"
一种相似的转义序列可切换下划线效果 (在 rxvt 和 aterm 上).
bash$ echo -e "\033[4mThis is underlined text.\033[0m"
echo使用-e选项可以启用转义序列.
其他的转义序列可用于更改文本或/和背景色彩.
bash$ echo -e '\E[34;47mThis prints in blue.'; tput sgr0
bash$ echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0
bash$ echo -e '\E[1;33;44m'"BOLD yellow text on blue background"; tput sgr0
通常为淡色的前景色文本设置粗体效果是较好的.
tput sgr0 把终端设置恢复为原样. 如果省略这一句会使后续在该终端的输出仍为蓝色.
因为tput sgr0 在某些环境下不能恢复终端设置,
echo -ne \E[0m 会是更好的选择.
可以在有色的背景上用下面的模板写有色彩的文本Use the following template for writing colored text on a colored
background.
echo -e '\E[COLOR1;COLOR2mSome text goes here.'
"\E[" 开始转义序列.
分号分隔的数值"COLOR1" 和 "COLOR2" 指定前景色和背景色, 数值和色彩的对应参见下面的表格. (数值的顺序不是有关系的,因为前景色和背景色数值都落在不重叠的范围里.) "m"终止该转义序列, 然后文本以结束的转义指定的属性显示.
也要注意到用单引号引用了echo -e后面的余下命令序列.
下表的数值是在 rxvt 终端运行的结果. 具体效果可能在其他的各种终端上不一样.
表 33-1. 转义序列中数值和彩色的对应
例子 33-13. 显示彩色文本
1&#!/bin/bash
2&# color-echo.sh: 用彩色来显示文本.
4&# 依照需要修改这个脚本.
5&# 这比手写彩色的代码更容易一些.
7&black='\E[30;47m'
8&red='\E[31;47m'
9&green='\E[32;47m'
10&yellow='\E[33;47m'
11&blue='\E[34;47m'
12&magenta='\E[35;47m'
13&cyan='\E[36;47m'
14&white='\E[37;47m'
17&alias Reset="tput sgr0"
把文本属性重设回原来没有清屏前的
21&cecho ()
# Color-echo.
# 参数 $1 = 要显示的信息
# 参数 $2 = 颜色
25&local default_msg="No message passed."
# 不是非要一个本地变量.
28&message=${1:-$default_msg}
# 默认的信息.
29&color=${2:-$black}
# 如果没有指定,默认使用黑色.
echo -e "$color"
echo "$message"
# 重设文本属性.
39&# 现在,让我们试试.
40&# ----------------------------------------------------
41&cecho "Feeling blue..." $blue
42&cecho "Magenta looks more like purple." $magenta
43&cecho "Green with envy." $green
44&cecho "Seeing red?" $red
45&cecho "Cyan, more familiarly known as aqua." $cyan
46&cecho "No color passed (defaults to black)."
# 缺失 $color (色彩)参数.
48&cecho "\"Empty\" color passed (defaults to black)." ""
# 空的 $color (色彩)参数.
# $message(信息) 和 $color (色彩)参数都缺失.
52&cecho "" ""
# 空的 $message (信息)和 $color (色彩)参数.
54&# ----------------------------------------------------
60&# 练习:
61&# ---------
62&# 1) 为'cecho ()'函数增加粗体的效果.
63&# 2) 增加可选的彩色背景.
例子 33-14. "赛马" 游戏
1&#!/bin/bash
2&# horserace.sh: 非常简单的赛马模拟.
3&# 作者: Stefano Palmeri
4&# 已取得使用许可.
6&################################################################
使用转义字符和终端颜色.
编辑脚本使其更具有随机性,
12&#+ 设置一个假的赌场 . . .
嗯 . . . 嗯 . . . 这个开始使我想起了一部电影 . . .
脚本给每匹马一个随机的障碍.
不均等会以障碍来计算
17&#+ 并且用一种欧洲风格表达出来.
例如: 机率(odds)=3.75 意味着如果你押1美元赢,
19&#+ 你可以赢得3.75美元.
脚本已经在GNU/Linux操作系统上测试过 OS,
22&#+ 测试终端有xterm 和 rxvt, 及 konsole.
测试机器有AMD 900 MHz 的处理器,
24&#+ 平均比赛时间是75秒.
在更快的计算机上比赛时间应该会更低.
所以, 如果你想有更多的悬念,重设USLEEP_ARG 变量的值.
由Stefano Palmeri编写.
29&################################################################
31&E_RUNERR=65
33&# 检查 md5sum 和 bc 是不是安装了.
34&if ! which bc &> /dev/ then
echo bc is not installed.
echo "Can\'t run . . . "
exit $E_RUNERR
39&if ! which md5sum &> /dev/ then
echo md5sum is not installed.
echo "Can\'t run . . . "
exit $E_RUNERR
更改下面的变量值可以使脚本执行的更慢.
它会作为usleep的参数 (man usleep)
47&#+ 并且它的单位是微秒 (500000微秒 = 半秒).
48&USLEEP_ARG=0
如果脚本接收到ctrl-c中断,清除临时目录, 恢复终端光标和颜色
52&trap 'echo -en "\E[?25h"; echo -en "\E[0m";\
53&tput cup 20 0; rm -fr
$HORSE_RACE_TMP_DIR'
参考调试的章节了解'trap'的更多解释
56&# 给脚本设置一个唯一(实际不是绝对唯一的)的临时目录名.
57&HORSE_RACE_TMP_DIR=$HOME/.horserace-`date +%s`-`head -c10 /dev/urandom | md5sum | head -c30`
59&# 创建临时目录,并切换到该目录下.
60&mkdir $HORSE_RACE_TMP_DIR
61&cd $HORSE_RACE_TMP_DIR
这个函数把光标移动到行为 $1 列为 $2 然后打印 $3.
例如: "move_and_echo 5 10 linux" 等同于
66&#+ "tput cup 4 9; echo linux", 但是用一个命令代替了两个.
注: "tput cup" 表示在终端左上角的 0 0 位置,
68&#+ echo 是在终端的左上角的 1 1 位置.
69&move_and_echo() {
echo -ne "\E[${1};${2}H""$3"
73&# 产生1-9之间伪随机数的函数.
74&random_1_9 () {
head -c10 /dev/urandom | md5sum | tr -d [a-z] | tr -d 0 | cut -c1
画马时模拟运动的两个函数.
79&draw_horse_one() {
echo -n " "//$MOVE_HORSE//
82&draw_horse_two(){
echo -n " "\\\\$MOVE_HORSE\\\\
87&# 取得当前的终端尺寸.
88&N_COLS=`tput cols`
89&N_LINES=`tput lines`
91&# 至少需要 20-行 X 80-列 的终端尺寸. 检查一下.
92&if [ $N_COLS -lt 80 ] || [ $N_LINES -lt 20 ]; then
echo "`basename $0` needs a 80-cols X 20-lines terminal."
echo "Your terminal is ${N_COLS}-cols X ${N_LINES}-lines."
exit $E_RUNERR
99&# 开始画赛场.
101&# 需要一个80个字符的字符串,看下面的.
102&BLANK80=`seq -s "" 100 | head -c80`
106&# 把前景和背景颜色设置成白色的.
107&echo -ne '\E[37;47m'
109&# 把光标移到终端的左上角.
110&tput cup 0 0
112&# 画六条白线.
113&for n in `seq 5`; do
echo $BLANK80
# 线是用80个字符组成的字符串.
117&# 把前景色设置成黑色.
118&echo -ne '\E[30m'
120&move_and_echo 3 1 "START
121&move_and_echo 3 75 FINISH
122&move_and_echo 1 5 "|"
123&move_and_echo 1 80 "|"
124&move_and_echo 2 5 "|"
125&move_and_echo 2 80 "|"
126&move_and_echo 4 5 "|
127&move_and_echo 4 80 "|"
128&move_and_echo 5 5 "V
129&move_and_echo 5 80 "V"
131&# 把前景色设置成红色.
132&echo -ne '\E[31m'
134&# 一些ASCII艺术.
135&move_and_echo 1 8 "..@@@..@@@@@...@@@@@.@...@..@@@@..."
136&move_and_echo 2 8 ".@...@...@.......@...@...@.@......."
137&move_and_echo 3 8 ".@@@@@...@.......@...@@@@@.@@@@...."
138&move_and_echo 4 8 ".@...@...@.......@...@...@.@......."
139&move_and_echo 5 8 ".@...@...@.......@...@...@..@@@@..."
140&move_and_echo 1 43 "@@@@...@@@...@@@@..@@@@..@@@@."
141&move_and_echo 2 43 "@...@.@...@.@.....@.....@....."
142&move_and_echo 3 43 "@@@@..@@@@@.@.....@@@@...@@@.."
143&move_and_echo 4 43 "@..@..@...@.@.....@.........@."
144&move_and_echo 5 43 "@...@.@...@..@@@@..@@@@.@@@@.."
147&# 把前景和背景颜色设为绿色.
148&echo -ne '\E[32;42m'
150&# 画11行绿线.
151&tput cup 5 0
152&for n in `seq 11`; do
echo $BLANK80
156&# 把前景色设为黑色.
157&echo -ne '\E[30m'
158&tput cup 5 0
160&# 画栅栏.
161&echo "++++++++++++++++++++++++++++++++++++++\
162&++++++++++++++++++++++++++++++++++++++++++"
164&tput cup 15 0
165&echo "++++++++++++++++++++++++++++++++++++++\
166&++++++++++++++++++++++++++++++++++++++++++"
168&# 把前景和背景色设回白色.
169&echo -ne '\E[37;47m'
171&# 画3条白线.
172&for n in `seq 3`; do
echo $BLANK80
176&# 把前景色设为黑色.
177&echo -ne '\E[30m'
179&# 创建9个文件来保存障碍物.
180&for n in `seq 10 7 68`; do
184&# 设置脚本要画的马的类型为第一种类型.
185&HORSE_TYPE=2
为每匹马创建位置文件和机率文件.
188&#+ 在这些文件里保存了该匹马当前的位置,
189&#+ 类型和机率.
190&for HN in `seq 9`; do
touch horse_${HN}_position
touch odds_${HN}
echo \-1 > horse_${HN}_position
echo $HORSE_TYPE >>
horse_${HN}_position
# 给马定义随机的障碍物.
HANDICAP=`random_1_9`
# 检查random_1_9函数是否返回了有效值.
while ! echo $HANDICAP | grep [1-9] &> /dev/ do
HANDICAP=`random_1_9`
# 给马定义最后的障碍的位置.
LHP=`expr $HANDICAP \* 7 + 3`
for FILE in `seq 10 7 $LHP`; do
echo $HN >> $FILE
# 计算机率.
case $HANDICAP in
1) ODDS=`echo $HANDICAP \* 0.25 + 1.25 | bc`
echo $ODDS > odds_${HN}
2 | 3) ODDS=`echo $HANDICAP \* 0.40 + 1.25 | bc`
echo $ODDS > odds_${HN}
4 | 5 | 6) ODDS=`echo $HANDICAP \* 0.55 + 1.25 | bc`
echo $ODDS > odds_${HN}
7 | 8) ODDS=`echo $HANDICAP \* 0.75 + 1.25 | bc`
echo $ODDS > odds_${HN}
9) ODDS=`echo $HANDICAP \* 0.90 + 1.25 | bc`
echo $ODDS > odds_${HN}
229&# 打印机率.
230&print_odds() {
231&tput cup 6 0
232&echo -ne '\E[30;42m'
233&for HN in `seq 9`; do
echo "#$HN odds->" `cat odds_${HN}`
238&# 在起跑线上画马.
239&draw_horses() {
240&tput cup 6 0
241&echo -ne '\E[30;42m'
242&for HN in `seq 9`; do
echo /\\$HN/\\"
247&print_odds
249&echo -ne '\E[47m'
250&# 等待回车按键开始赛马.
251&# 转义序列'\E[?25l'禁显了光标.
252&tput cup 17 0
253&echo -e '\E[?25l'Press [enter] key to start the race...
254&read -s
禁用了终端的常规显示功能.
这避免了赛跑时不小心按了按键键入显示字符而弄乱了屏幕.
259&stty -echo
261&# --------------------------------------------------------
262&# 开始赛跑.
264&draw_horses
265&echo -ne '\E[37;47m'
266&move_and_echo 18 1 $BLANK80
267&echo -ne '\E[30m'
268&move_and_echo 18 1 Starting...
269&sleep 1
271&# 设置终点线的列数.
272&WINNING_POS=74
274&# 记录赛跑开始的时间.
275&START_TIME=`date +%s`
277&# COL 是由下面的"while"结构使用的.
280&while [ $COL -lt $WINNING_POS ]; do
MOVE_HORSE=0
# 检查random_1_9函数是否返回了有效值.
while ! echo $MOVE_HORSE | grep [1-9] &> /dev/ do
MOVE_HORSE=`random_1_9`
# 取得随机取得的马的类型和当前位置.
HORSE_TYPE=`cat
horse_${MOVE_HORSE}_position | tail -1`
COL=$(expr `cat
horse_${MOVE_HORSE}_position | head -1`)
# 检查当前的位置是否是障碍物的位置.
if seq 10 7 68 | grep -w $COL &> /dev/ then
if grep -w $MOVE_HORSE $COL &> /dev/ then
grep -v -w
$MOVE_HORSE $COL > ${COL}_new
rm -f $COL
mv -f ${COL}_new $COL
else ADD_POS=1
else ADD_POS=1
COL=`expr $COL + $ADD_POS`
echo $COL >
horse_${MOVE_HORSE}_position
# 保存新位置.
# 选择要画的马的类型.
case $HORSE_TYPE in
1) HORSE_TYPE=2; DRAW_HORSE=draw_horse_two
2) HORSE_TYPE=1; DRAW_HORSE=draw_horse_one
echo $HORSE_TYPE >>
horse_${MOVE_HORSE}_position # 保存当前类型.
# 把前景色设为黑,背景色设为绿.
echo -ne '\E[30;42m'
# 把光标位置移到新的马的位置.
tput cup `expr $MOVE_HORSE + 5`
horse_${MOVE_HORSE}_position | head -1`
$DRAW_HORSE
usleep $USLEEP_ARG
# 当所有的马都越过15行的之后,再次打印机率.
touch fieldline15
if [ $COL = 15 ]; then
echo $MOVE_HORSE >> fieldline15
if [ `wc -l fieldline15 | cut -f1 -d " "` = 9 ]; then
print_odds
: > fieldline15
# 取得领头的马.
HIGHEST_POS=`cat *position | sort -n | tail -1`
# 把背景色重设为白色.
echo -ne '\E[47m'
tput cup 17 0
echo -n Current leader: `grep -w $HIGHEST_POS *position | cut -c7`"
346&# 取得赛马结束的时间.
347&FINISH_TIME=`date +%s`
349&# 背景色设为绿色并且启用闪动的功能.
350&echo -ne '\E[30;42m'
351&echo -en '\E[5m'
353&# 使获胜的马闪动.
354&tput cup `expr $MOVE_HORSE + 5` `cat
horse_${MOVE_HORSE}_position | head -1`
355&$DRAW_HORSE
357&# 禁用闪动文本.
358&echo -en '\E[25m'
360&# 把前景和背景色设为白色.
361&echo -ne '\E[37;47m'
362&move_and_echo 18 1 $BLANK80
364&# 前景色设为黑色.
365&echo -ne '\E[30m'
367&# 闪动获胜的马.
368&tput cup 17 0
369&echo -e "\E[5mWINNER: $MOVE_HORSE\E[25m""
Odds: `cat odds_${MOVE_HORSE}`"\
Race time: `expr $FINISH_TIME - $START_TIME` secs"
372&# 恢复光标和最初的颜色.
373&echo -en "\E[?25h"
374&echo -en "\E[0m"
376&# 恢复回显功能.
377&stty echo
379&# 删除赛跑的临时文件.
380&rm -rf $HORSE_RACE_TMP_DIR
382&tput cup 19 0
384&exit 0
参考 例子 A-22.
然而,有一个主要的问题,那就是ANSI 转义序列是不可移植的. 在一些终端运行的很好的代码可能在另外一些终端上可能运行地很糟糕. 在彩色脚本作者终端上运行的很好的脚本可能在另外一些终端上就产生不可阅读的输出了. 这给彩色脚本的用处大大打了个折扣,而很可能使这些技术变成一个暗机关或只是一个玩具而已.
Moshe Jacobson的颜色工具(http://runslinux.net/projects.html#color)能相当容易地使用ANSI转义序列. 它用清晰和较有逻辑的语法来代替刚才讨论的难用的结构.
Henry/teikedvl 也同样开发了一个软件包来简化彩色脚本的一些操作 (http://scriptechocolor.sourceforge.net/).
[1]当然,ANSI是American National Standards
Institute(美国国家标准组织)的缩写. 这个令人敬畏的组织建立和维护着许多技术和工业的标准.PrevHomeNextRecursionUpOptimizations

我要回帖

更多关于 c 转义序列 的文章

 

随机推荐