如何在linux shell脚本攻略终端里用Shell和C输出带颜色的文字

Linux下Shell脚本输出带颜色文字_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
20页免费61页免费2页免费18页1下载券14页7下载券3页免费1页免费4页1下载券31页4下载券27页1下载券
喜欢此文档的还喜欢4页1下载券13页1下载券7页1下载券7页1下载券15页1下载券
Linux下Shell脚本输出带颜色文字|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分819 信誉积分535 UID阅读权限100积分620帖子精华可用积分620 专家积分788 在线时间5364 小时注册时间最后登录
帖子主题精华可用积分620 专家积分788 在线时间5364 小时注册时间最后登录
论坛徽章:0
有时候为了实现在终端输出的时候字体能够带颜色,并且可以产生简单的闪烁的功能,特写了下列的代码
实现hello world的带颜色的输出,并且每过一秒产生一个闪烁的功能.
#include&stdio.h&
#include&unistd.h&
#include&signal.h&
#include&stdlib.h&
int flag = 0;
void sig_int(int signum)
{
& && &&&if (flag == 1)
& && && && && & fprintf(stderr, &\033[47;31mhello world\033[5m&);
& && &&&fprintf(stderr,&\033[;\033[0m&);
& && &&&fprintf(stderr,&\033[;\033[0m&);
& && &&&printf(&\n&);
& && &&&exit(0);
}
int main()
{
& && &&&int i = 0;
& && &&&struct sigaction sig_
& && &&&sig_act.sa_handler = sig_
& && &&&sigemptyset(&sig_act.sa_mask);
& && &&&sig_act.sa_flags = 0;
& && &&&if (sigaction(SIGINT, &sig_act, NULL) & 0)
& && &&&{
& && && && && & fprintf(stderr, &signal error\n&);
& && && && && & exit(1);
& && &&&}
& && &&&while (i++ & 10)
& && &&&{
& && && && && & fprintf(stderr, &\033[;\033[s&); /*使用stderr是因为其是不带缓存的*/
& && && && && & fprintf(stderr, &\033[47;31mhello world\033[5m&);
& && && && && & flag = 0;
& && && && && & sleep(1);
& && && && && & fprintf(stderr, &\033[;\033[u&);
& && && && && & fprintf(stderr, &\033[;\033[K&);
& && && && && & flag = 1;
& && && && && & sleep(1);
& && &&&}
& && &&&fprintf(stderr, &\033[47;31mhello world\033[5m&);
& && &&&fprintf(stderr,&\033[;\033[0m&);
& && &&&printf(&\n&);
& && &&&return 0;
}复制代码
该程序实现输出十次hello world然后退出. 使用一个信号是为了还原默认的终端输出的颜色.
另外再讲讲如何输出颜色以及颜色的代码.
格式:
printf(&\033[字背景颜色;字体颜色m字符串\033[0m& );&&
printf(&\033[47;31mhello world\033[5m&);
47是字背景颜色, 31是字体的颜色, hello world是字符串.&&后面的\033[5m是控制码. 复制代码
颜色代码:
字背景颜色范围: 40--49& && && && && && & 字颜色: 30--39
& && && && &40: 黑& && && && && && && && &&&30: 黑
& && &&&41: 红& && && && && && && && &&&31: 红
& && &&&42: 绿& && && && && && && && &&&32: 绿
& && &&&43: 黄& && && && && && && && &&&33: 黄
& && &&&44: 蓝& && && && && && && && &&&34: 蓝
& && &&&45: 紫& && && && && && && && &&&35: 紫
& && &&&46: 深绿& && && && && && && && &36: 深绿
& && &&&47: 白色& && && && && && && && &37: 白色
ANSI控制码:
& &\033[0m& &关闭所有属性& &
&&\033[1m& &设置高亮度& &
&&\03[4m& &下划线& &
&&\033[5m& &闪烁& &
&&\033[7m& &反显& &
&&\033[8m& &消隐& &
&&\033[30m& &--& &\033[37m& &设置前景色& &
&&\033[40m& &--& &\033[47m& &设置背景色& &
&&\033[nA& &光标上移n行& &
&&\03[nB& &光标下移n行& &
&&\033[nC& &光标右移n行& &
&&\033[nD& &光标左移n行& &
&&\033[y;xH设置光标位置& &
&&\033[2J& &清屏& &
&&\033[K& &清除从光标到行尾的内容& &
&&\033[s& &保存光标位置& &
&&\033[u& &恢复光标位置& &
&&\033[?25l& &隐藏光标& &
&&\33[?25h& &显示光标
这样, 在某些时候就可以实现动态的输出.
把自己角色扮演好
全力以赴每一秒!
应届毕业生找工作中!
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分114 UID696344阅读权限10积分61帖子精华可用积分61 专家积分0 在线时间30 小时注册时间最后登录
白手起家, 积分 61, 距离下一级还需 139 积分
帖子主题精华可用积分61 专家积分0 在线时间30 小时注册时间最后登录
论坛徽章:0
不错,帮顶一下!
空间积分0 信誉积分110 UID阅读权限100积分2494帖子精华可用积分2496 专家积分5 在线时间376 小时注册时间最后登录
帖子主题精华可用积分2496 专家积分5 在线时间376 小时注册时间最后登录
论坛徽章:0
玩过以前的BBS就知道了
空间积分0 信誉积分2313 UID阅读权限100积分136985帖子精华可用积分136985 专家积分55 在线时间4544 小时注册时间最后登录
帖子主题精华可用积分136985 专家积分55 在线时间4544 小时注册时间最后登录
论坛徽章:8
原帖由 scutan 于
11:00 发表
有时候为了实现在终端输出的时候字体能够带颜色,并且可以产生简单的闪烁的功能,特写了下列的代码
实现hello world的带颜色的输出,并且每过一秒产生一个闪烁的功能.
#include&stdio.h&
#include& ...
竟然不判断一下终端类型
I can explain it for you, but I can’t understand it for you.
空间积分819 信誉积分535 UID阅读权限100积分620帖子精华可用积分620 专家积分788 在线时间5364 小时注册时间最后登录
帖子主题精华可用积分620 专家积分788 在线时间5364 小时注册时间最后登录
论坛徽章:0
只是为了简单地描述一下有些实现的方法而已 没有考虑其它那么多
把自己角色扮演好
全力以赴每一秒!
应届毕业生找工作中!
空间积分0 信誉积分2313 UID阅读权限100积分136985帖子精华可用积分136985 专家积分55 在线时间4544 小时注册时间最后登录
帖子主题精华可用积分136985 专家积分55 在线时间4544 小时注册时间最后登录
论坛徽章:8
原帖由 scutan 于
12:55 发表
只是为了简单地描述一下有些实现的方法而已 没有考虑其它那么多
呃……这个习惯不太好。
I can explain it for you, but I can’t understand it for you.
空间积分819 信誉积分535 UID阅读权限100积分620帖子精华可用积分620 专家积分788 在线时间5364 小时注册时间最后登录
帖子主题精华可用积分620 专家积分788 在线时间5364 小时注册时间最后登录
论坛徽章:0
回复 6楼 MMMIX 的帖子
嗯. 以后我多注意一下. 谢谢.
编程是应该更加细心, 少点浮躁.
把自己角色扮演好
全力以赴每一秒!
应届毕业生找工作中!
空间积分0 信誉积分142 UID阅读权限10积分29帖子精华可用积分29 专家积分0 在线时间25 小时注册时间最后登录
白手起家, 积分 29, 距离下一级还需 171 积分
帖子主题精华可用积分29 专家积分0 在线时间25 小时注册时间最后登录
论坛徽章:0
回复 1楼 scutan 的帖子
闪烁的功能,有时候还是觉得可以用一下. 多了解了一点知识了.
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处Linux中Shell入门教程-linux-操作系统-壹聚教程网Linux中Shell入门教程本文章从五个方面来介绍linux中shell命令,包括有Shell变量、Shell的基本结构、Shell函数的返回值、Shell函数详解 、Shell当中的特殊变量 希望能对初学者有所帮助。 Shell入门教程:Shell变量&&&
变量是暂时用来存储数据的地方,是一个内存空间。bash shell和其他的编程语言,没有&数据形态&,也就是说默认情况下不区分一个变量是整型还是浮点型等,除非你使用declare语句申明变量类型。在bash shell中,默认只有一种数据型,就是由字符组成的字符串。同时,设定的变量只在当前的shell中存在,也就是,每一个shell都会维护一份他们自己的变量,彼此不会有影响。可以把变量导出成环境变量,这样其他的shell就可以被子shell引用。
变量的命名规则:
1.可以使用英文字母、数字和下划线组成
2.第一个字符不能是数字
3.区分大小写
变量设定:
例如:name=john
建议这样设定变量:name=&john& 或者name='john'
在引用变量的时候使用双引号和单引号是有区别的,单引号不会进行变量替换。而在双引号中,如果也想抑制变量替换,则需要使用转义符反斜线
引用变量:
建议这样引用变量:${变量名}
环境变量:
使用下面的任意一个方法可以使name变为环境变量
name=&john&
export name
export name=&john&
declare -x name=&john&
bash的一些重要的内置变量:
$1 ~ $n?&& 参数位置。当n超过9后,使用${n},例如${10}
$*&& 代表所有的参数位置,而且视为一个字符串
$@&& 代表所有的参数位置,但是代表各位置参数组成的串行
$#&&& 参数的个数
$?&&& 上一个命令的返回值
$!&&& 上一个后台进程的编号
$$&& 目前shell的进程编号
Shell的基本结构&
shell程序的基本组成结构
shell结构大体是由设定变量、内置命令、shell的语法结构、函数组成。
使用实例说明:test.sh
#!/bin/bash
#说明使用/bin/bash作为这个脚本的解释器
#定义一个函数
function my_fun () {
&echo &Hello, $1,today is $2&
#定义连个变量
today=`date`
my_fun &$name& &$today&
上面的这个脚本要想运行还需要做一些操作,首先给予执行权限
chmod +x test.sh
./test.sh john
Hello, john,today is Tue Jun? 1 14:51:46 CST 2010
父shell和子shell
在执行script之前,身处的环境就是父shell。执行script之时,父shell根据#!/bin/bash,fork出来一个新的shell环境,然后在子shell中执行,执行完毕后子shell结束,任然回到父shell中,这样不会影响到父shell的环境。
这张图片是login shell的流程,当是non-login shell时,只执行方框中的标注的部分。由这张图我们可以知道,在如下几种情况下,执行的流程。
登陆(login)
/etc/profile
~/.bash_profile
注销(logout)
~/.bash_logout
执行新shell,分成两种情况
1.执行交互式的shell
/etc/bashrc
2.执行非交互式的shell,比如执行script会检查 BASH_ENV 变量的内容,如果有定义,则执行。
Shell函数的返回值&&&
shell函数返回值一般有3种方式:
1、return语句(默认的返回值)
shell函数的返回值可以和其他语言的返回值一样,通过return语句返回。
#!/bin/bash
function mytest() {
&echo &mytest function&
&echo &argv[1] = $1&
&if [ $1 = &1& ] ;then
&&return 1
&&return 0
echo &mytest 1&
echo &mytest 0&
if mytest 1 ; then
&echo &mytest 1&
if mytest 0 ;then
&echo &mytest 0&
echo &end&
先定义了一个函数,mytest,它根据输入的参数是否为1来return 1,否则return 0。
获取函数的返回值通过调用函数,或者最后执行的值获得。
另外,可以直接用函数的返回值用作if的判断。
注意:return只能用来返回整数值,且和c的区别是返回为正确,其他的值为错误。
2、全局变量或者环境变量
这种就类似于c中的全局变量。
#!/bin/bash
function mytest2() {
&echo &mytest2&
&echo &args $1&
echo &g_var=$g_var&
函数mytest2通过修改全局变量的值来返回结果。
3、以上两个方法失效的时候
以上介绍的这两种方法在一般情况下都是好使的,但也有例外。
#!/bin/bash
function mytest3() {
&grep &123& test.txt | awk -F: '{print $2}' |do
&echo &$line&
&if [ $line = &yxb& ]; then
&&return 0
&echo &mytest3 here &
function mytest4() {
&grep &123& test.txt | awk -F: '{print $2}' |do
&echo &$line&
&if [ $line = &yxb& ]; then
&&echo &g_var=0&
&&return 0
&echo &mytest4 here &
echo &g_var=$g_var&
test.txt中的内容如下:
输出如下:
yxb@yxb-laptop:~/文档/个人文档/shell函数返回值$ ./no_function.sh
mytest3 here
mytest4 here
可以看到mytest3在return了以后其实没有直接返回,而是执行了循环体后的语句,同时看到mytest4中也是一样,同时,在mytest4中,对全局变量的修改也无济于事,全局变量的值根本就没有改变。
这个是什么原因那?
笔者认为,之所以return语句没有直接返回,是因为return语句是在管道中执行的,管道其实是另一个子进程,而return只是从子进程中返回而已,只是while语句结束了,而函数体之后的语句会继续执行。
同理,全局变量在子进程中进行了修改,但是子进程的修改没有办法反应到父进程中,全局变量只是作为一个环境变量传入子进程,子进程修改自己的环境变量,不会影响到父进程。
因此在写shell函数的时候,用到管道的时候一定要清楚,此刻是从什么地方返回。
4、echo返回值(显式输出)
其实在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。因此不存在上面提到的由于管道导致返回值失效的情况。
在外边只需要获取函数的返回值即可。
#!/bin/bash
function mytest5() {
&grep &123& test.txt | awk -F: '{print $2}' |do
&if [ $line = &yxb& ]; then
&&echo &0&
&&return 0
result=$(mytest5)
if [ -z $result ]; then
&echo &no yxb. result is empyt&
&echo &have yxb, result is $result&
输出如下:
view sourceprint?
1 have yxb, result is 0
这个方式虽然好使,但是有一点一定要注意,不能向标准输出一些不是结果的东西,比如调试信息,这些信息可以重定向到一个文件中解决,特别要注意的是,用到比如grep这样的命令的时候,一定要记得 1&/dev/null 2&&1 来避免这些命令的输出。
echo输出另一技巧:用函数的返回值作为另外一个函数的参数
#!/bin/bash
Dir=/cygdrive/d/server/ebin
function display() {
&files=`ls $Dir`
&echo $files
echo `display`
function filetype() {
&&& echo `file $Dir/$1`& #输出待检测文件的类型
for file in `display`&&& #调用display函数,对其返回值做遍历
&&& filetype $file&&&&&& #检测文件类型并输出
用 $? 来获取函数的 return值,用 $(函数名) 来获取函数的 echo值。
Shell函数详解&&
Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快。
1、函数定义
function 函数名() {
关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后可以跟一个括号,符号&{&表示函数执行命令的入口,该符号也可以在函数名那一行,&}&表示函数体的结束,两个大括号之间是函数体。
语句部分可以是任意的Shell命令,也可以调用其他的函数。
如果在函数中使用exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行。
可以使用break语句来中断函数的执行。
declare &f 可以显示定义的函数清单
declare &F 可以只显示定义的函数名
unset &f 可以从Shell内存中删除函数
export &f 将函数输出给Shell
另外,函数的定义可以放到 .bash_profile 文件中,也可以放到使用函数的脚本中,还可以直接放到命令行中,还可以使用内部的unset命令删除函数。一旦用户注销,Shell将不再保持这些函数。
2、函数的调用
函数调用的实例:
#!/bin/bash
function show() {
&echo &hello , you are cal the function&
echo &first time call the function&
echo &second time call the function&
3、函数参数的传递
函数可以通过位置变量传递参数。例如
函数名 参数1 参数2 参数3 参数4
当函数执行时,$1 对应 参数1,其他依次类推。
#!/bin/bash
function show() {
&echo &hello , you are calling the function& $1&
echo &first time call the function&
show first
echo &second time call the function&
show second
4、函数的返回值
函数中的关键字&return&可以放到函数体的任意位置,通常用于返回某些值,Shell在执行到return之后,就停止往下执行,返回到主程序的调用行,return的返回值只能是0~256之间的一个整数,返回值将保存到变量&$?&中。
#!/bin/bash
function abc() {
&RESULT=`expr $1 % 2`&& #表示取余数
&if [ $RESULT &ne 0 ] ; then
&&return 0
&&return 1
echo &Please enter a number who can devide by 2&
case $? in
&&echo &yes ,it is&
&&echo &no ,it isn&t&
在这里要注意参数传递了,上面read进来的数字,必须加上$符号才能传递给函数,我刚开始不知道是哪里错了,找了半天才知道是这里出错了。
5、函数的载入
如果函数在另外一个文件中,我们该怎么调用它呢?
这里就有一个方法。比如 show 函数写在了function.sh里面了,我们就可以用
source function.sh&
这样就可以调用了。
6、函数的删除
用法:unset &f 函数名
7、函数的变量作用域
默认情况下,变量具有全局作用域,如果想把它设置为局部作用域,可以在其前加入local
&local a=&hello&
使用局部变量,使得函数在执行完毕后,自动释放变量所占用的内存空间,从而减少系统资源的消耗,在运行大型的程序时,定义和使用局部变量尤为重要。
8、函数的嵌套
函数可以进行嵌套,实例:
#!/bin/bash
function first() {
&function second() {
&&function third() {
&&&echo &------this is third&
&&echo &this is the second&
&echo &this is the first&
echo &start...&
Shell当中的特殊变量&&&
一、保留变量
$IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格。
$HOME 这个变量中存储了当前用户的根目录路径。
$PATH 这个变量中存储了当前 Shell 的默认路径字符串。
$PS1 表示第一个系统提示符。
$PS2 表示的二个系统提示符。
$PWD 表示当前工作路径。
$EDITOR 表示系统的默认编辑器名称。
$BASH 表示当前 Shell 的路径字符串。
$0, $1, $2, ...
表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
$# 表示脚本程序的命令参数个数或函数的参数个数。
$$ 表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。
$? 表示脚本程序或函数的返回状态值,正常为 0,否则为非零的错误号。
$* 表示所有的脚本参数或函数参数。
$@ 和 $* 涵义相似,但是比 $* 更安全。
$! 表示最近一个在后台运行的进程的进程号。
二、随机数
随机数是经常要用到的,BASH 中也提供了这个功能,请看下面这个程序:
#!/bin/bash
# Prints different random integer from 1 to 65536
这个程序可以在每次执行的时候随机的打印出一个大小在 1 到 65536 之间的整数。
上一页: &&&&&下一页:相关内容编辑推荐下次自动登录
现在的位置:
编译mcrypt后,加载报错
Centos6.0下编译完mcrypt加载,重启php后报错:
PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-/mcrypt.so' - libltdl.so.3: cannot open shared object file: No such file or directory in Unknown on line 0
解决方法:
ln -s /usr/local/lib/libltdl.so.3 /usr/lib/libltdl.so.3
mcrypt安装方法:通过epel仓库直接安装 # yum install libmcrypt libmcrypt-devel
进入php安装包的ext/mcrypt目录
# /usr/local/php/bin/phpize
生成configure文件
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
【上篇】【下篇】
您可能还会对这些文章感兴趣!
日志总数:273篇
评论总数:607条
分类总数:24个
标签总数:462个
友情链接:18个
网站运行:1283天
最后更新:日

我要回帖

更多关于 linux shell编程 的文章

 

随机推荐