linux echo和printf打印输出

复制代码
[root@node2 scprits]#  echo Hello World!
Hello World!
[root@node2 scprits]# echo 'Hello World!'
Hello World!
[root@node2 scprits]# echo "Hello World!" 
-bash: !": event not found
#双引号不能打印感叹号
[root@node2 scprits]# echo Hello World!;echo 'Hello World!'  
-bash: !: event not found
[root@node2 scprits]# echo 'Hello World!';echo Hello World!
Hello World!
Hello World!
#感叹号可以在最结尾
复制代码

从上面几个实验发现,在bash环境下,要输出感叹号必须使用单引号。这是因为默认情况下开启了使用感叹号引用内存中的历史命令的设置,可以使用set +H关闭该设置,这时可以使用感叹号输出。

[root@node2 scprits]# set +H
[root@node2 scprits]# echo "Hello World!"
Hello World!

或者使用多对引号分别包围echo的参数,其中感叹号使用单引号包围,如下。

[root@node2 scprits]# echo "Don't use rm -rf command"'!'
Don't use rm -rf command!

如果echo不加任何引号,很显然不能输出分号“;”,因为分号会被shell解析为命令连接符号。

[root@node2 scprits]# echo Hello World;
Hello World
[root@node2 scprits]# echo "Hello World;"
Hello World;

但只加单引号又不能扩展变量,使用双引号又不好输出感叹号,所以echo命令克服各种疑难杂症的方法是对特殊符号分开引用。

[root@node2 scprits]# str=hello
[root@node2 scprits]# echo "$str"'!' "world"
hello! world

echo中的转义

echo -e识别转义和特殊意义的符号,如换行符、n、制表符\t、转义符\等。

[root@node2 scprits]# echo 'Hello World!\n';echo "Hello World"!  
Hello World!\n
Hello World!
[root@node2 scprits]# echo -e 'Hello World!\n';echo "Hello World"!
Hello World!

Hello World!

echo默认的分行处理

不加-n的默认情况下echo会在每行行尾加上换行符号,使用echo -n取消分行输出。

[root@node2 scprits]# echo -n 'Hello World!' >abc.sh 
[root@node2 scprits]# echo 'Hello World!' >>abc.sh
[root@node2 scprits]# cat abc.sh
Hello World!Hello World!
复制代码
[root@node2 scprits]# echo 'Hello World!'>abc.sh
[root@node2 scprits]# echo 'Hello World!'>>abc.sh 
[root@node2 scprits]# cat abc.sh 
Hello World!
Hello World!
复制代码

echo的颜色输出

echo可以控制字体颜色和背景颜色输出。

常见的字体颜色:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,紫色=35,天蓝色=36,白色=37。

常见的背景颜色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,紫色=45,天蓝色=46,白色=47。

字体控制选项:1表示高亮,4表示下划线,5表示闪烁等。

因为需要使用特殊符号,所以需要配合-e选项来识别特殊符号。

[root@node2 scprits]# echo -e "\e[1;41m Red Bcakground \e[0m"
 Red Bcakground 
[root@node2 scprits]#  echo -e "\e[1;31m Red Bcakground \e[0m" 
 Red Bcakground

颜色控制和字体控制选项的定义顺序无所谓,只要被定义出来,shell都能识别。建议定义了颜色后同时定义关闭颜色,否则颜色会继续影响bash环境的颜色。

另外,任意一个\e可以使用\033替换。如:

[root@node2 scprits]# echo -e "\033[1;41m Red Bcakground \033[0m"
 Red Bcakground 
[root@node2 scprits]#  echo -e "\e[1;31m Red Bcakground \033[0m" 
 Red Bcakground

 printf

使用printf可以输出更规则更格式化的结果。它引用于C语言的printf命令,但是有些许区别。

使用printf可以指定字符串的宽度、实现左对齐(使用减符号-)、右对齐(默认的)、格式化小数输出等。

使用printf最需要注意的两点是:

(1)printf默认不在结尾加换行符,它不像echo一样,所以要手动加“\n”换号;

(2)printf只是格式化输出,不会改变任何结果,所以在格式化浮点数的输出时,浮点数结果是不变的,仅仅只是改变了显示的结果。

复制代码
[root@node2 scprits]# cat >abc.sh<<eof
> #!/bin/bash
> #文件名:abc.sh
> printf "%-5s %-10s %-4s\n" No Name Mark     # 三个%分别对应后面的三个参数
> printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.34 # 减号“-”表示左对齐
> printf "%-5s %-10s %-4.2f\n" 2 James 90.998 # 5s表示第一个参数占用5个字符
> printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
> eof
[root@node2 scprits]# bash abc.sh 
No    Name       Mark
1     Sarath     80.34
2     James      91.00
3     Jeff       77.56
复制代码
复制代码
[root@node2 scprits]# sed -i s#'-'##g abc.sh
[root@node2 scprits]# cat abc.sh 
#!/bin/bash
#文件名:abc.sh
printf "%5s %10s %4s\n" No Name Mark     # 三个%分别对应后面的三个参数
printf "%5s %10s %4.2f\n" 1 Sarath 80.34 # 减号“”表示左对齐
printf "%5s %10s %4.2f\n" 2 James 90.998 # 5s表示第一个参数占用5个字符
printf "%5s %10s %4.2f\n" 3 Jeff 77.564
[root@node2 scprits]# bash abc.sh 
   No       Name Mark
    1     Sarath 80.34
    2      James 91.00
    3       Jeff 77.56
复制代码
复制代码
[root@node2 scprits]# cat abc.sh 
#!/bin/bash
#文件名:abc.sh
printf "%5s\t %10s\t %4s\n" No Name Mark     # 三个%分别对应后面的三个参数
printf "%5s\t %10s\t %4.2f\n" 1 Sarath 80.34 # 减号“”表示左对齐
printf "%5s\t %10s\t %4.2f\n" 2 James 90.998 # 5s表示第一个参数占用5个字符
printf "%5s\t %10s\t %4.2f\n" 3 Jeff 77.564
[root@node2 scprits]# bash abc.sh 
   No          Name      Mark
    1        Sarath      80.34
    2         James      91.00
    3          Jeff      77.56
复制代码

printf还有一个常见的i格式,表示对整型格式化占用几个整数,前面示例中的s表示对字符格式化。

Linux终端打印命令使用介绍

常用linux打印命令

日常使用中或shell脚本中linux终端打印命令有echo和printf。


 

 echo命令

功能说明:显示文字。
语   法:echo [-ne][字符串]或 echo [–help][–version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
参   数:-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息

echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为: echo [ -n ] 字符串
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。

 

echo要变换颜色的时候,要使用参数-e

格式: echo -e “\033[字背景颜色;字体颜色m字符串\033[0m”

例如:

echo -e “\033[41;36m something here \033[0m”

其中41的位置代表底色, 36的位置是代表字的颜色

那些ascii code 是对颜色调用的始末.

\033[ ; m …… \033[0m

让字体变为红色并且不停的闪烁

#echo -e “\033[31m \33[05m 请确认是否要停止当前的squid进程,输入 [Y/N] \033[0m”

或者

#echo -e “\033[31m \033[05m 请确认是否要停止当前的squid进程,输入 [Y/N] \033[0m”

字背景颜色范围:40—-49

40:黑

41:深红

42:绿

43:黄色

44:蓝色

45:紫色

46:深绿

47:白色

字颜色:30———–39

30:黑

31:红

32:绿

33:黄

34:蓝色

35:紫色

36:深绿

37:白色

===============================================ANSI控制码的说明

\33[0m 关闭所有属性

\33[1m 设置高亮度

\33[4m 下划线

\33[5m 闪烁

\33[7m 反显

\33[8m 消隐

\33[30m — \33[37m 设置前景色

\33[40m — \33[47m 设置背景色

\33[nA 光标上移n行

\33[nB 光标下移n行

\33[nC 光标右移n行

\33[nD 光标左移n行

\33[y;xH设置光标位置

\33[2J 清屏

\33[K 清除从光标到行尾的内容

\33[s 保存光标位置

\33[u 恢复光标位置

\33[?25l 隐藏光标

\33[?25h 显示光标

 

或参考这篇博客,也写的不错:

Linux的shell中echo改变输出显示样式 – 生活费 – 博客园
http://www.cnblogs.com/276815076/archive/2011/05/11/2043367.html

 


 

printf命令

Linux提供一个功能更强大,更灵活的打印命令printf。printf和C语言的使用方式类似。和echo不一样,它不会在最后自动加上换行,需要写入命令中。例如printf “Hello, world/n”。printf的命令格式如下:

 

printf format-string [arguments]

 

例子为:printf “%s, %s/n” hello world。如果格式需要的参数比后面给出的多,超出的部分为0或者null。格式如下。

%c:ASCII字符,如果参数给出字符串,则打印第一个字符
%d:10进制整数
%i:同%d
%e:浮点格式([-]d.精度[+-]dd)
%E:浮点格式([-]d.精度E[+-]dd)
%f:浮点格式([-]ddd.precision)
%g:%e或者%f的转换,如果后尾为0,则删除它们
%G:%E或者%f的转换,如果后尾为0,则删除它们
%o:8进制
%s:字符串
%u:非零正整数
%x:十六进制
%X:非零正数,16进制,使用A-F表示10-15
%%:表示字符”%”

如果需要限定输出的宽度,格式为%flags width.precision format-specifier,width是整数,右边对齐,如果需要左边对齐,在前面加“-”,例如”%-20s”表示从左边开始对齐,宽度为20,如果字符串长度少于20,通过空格补齐。precision在浮点值中提供四舍五入。例如%5.6G,长度为5,精度为6。精度是可选的。长度和精度的值可以参数中指定,例如printf “%*.*G/n” 5 6 $myvalue。长度指显示中占的字符长度,与字符长度的同义。如果长度比实际的少,例如实际字符长度更大或者所要求的精度更大,则显示按实际长度。

%d, %I, %o, %u, %x, %X:在里面使用精度,表示最小显示的数字。如果显示的数字比需求少,则补充0。缺省值为1.
%e, %E:在里面使用精度,表示最小显示的数字。如果显示的数字比需求少,在小数点后面补充0。缺省值为10.精度度为0经隐藏小数点。
%f:在这里的精度,表示小数点后面的数字的数目。
%g, %G:这里的精度,表示最大的有效数字的数目。
%s:这里的精度,表示最大的字符数目。

在前面,介绍了”-“作为左对齐,下面介绍这些特殊符号

-:左对齐
space:正数前面加空格,负数前面加符号,例如12.12,|% f|,显示| 12.120000|,注意前面留了一个空格。例如-12.12,|% f|,显示|-12.120000|
+:对于数码给予正负号。
#:给出另一种格式:

  • %o以8进制显示整数,而%#o则在前面加上零,表明是八进制,例如12,显示014
  • %x或者%X以16进制的方式显示整数,而%#x或者%#X,在16进制的整数前面加上0x或者0X来表示,例如12,显示0XC
  • %#e,%#E, %#f,将只以十进制显示
  • %#g,%#G,将不删除最后无关的补齐0,例如12.1200,将全部显示,而不是12.12。

0:对于数目,不使用空格,而使用0来作为补齐。

介绍两个特别的字符显示格式%b和%q。

 

%b:表示解析字符串的特殊的字符,包括/n等等。例如printf “%s/n” ‘hello/nworld’,显示hello/nworld,要将/n作为换行符,则需要用printf “%b/n” ‘hello/nworld’ 。

%q:printf “%q/n” “greetings to the world”显示为greetings/ to/ the/ world,可以作为shell的输入。