本文主要描述Linux系统中echo和printf命令的使用方法,包括命令参数的含义、使用技巧。
1、echo
了解一个命令我们首先要知道它能做什么,它有哪些参数,参数的含义,可以实现我们哪方面的需求。 echo可以直接将字符串打印输出到屏幕,也可以重定向输出到指定文件。
echo的语法:echo [option] [arguments]。首先看下字符串Hello Word打印
$ echo "Hello World"
Hello World
$
输出变量值
$ VAR1="Hello World" $ echo "${VAR1}" Hello World
可以观察到输出自动换行了。那如果我不想输出自动换行呢,带上参数-n?
$ echo -n "Hello World" Hello World$
注意观察美元$符号的位置。这只是简单的输出,如果我想格式化输出字符串呢,先看下直接输出的
$ echo "Hello\tWorld\nI am Back" Hello\tWorld\nI am Back $
可以看到,直接输出了\t(制表符)、\n(换行符),与我们预期不符,加上参数-e,如下
$ echo -e "Hello\tWorld\nI am Back" Hello World I am Back $
可以看到,\t(制表符)、\n(换行符)实现了作用,符合我们的预期要求。我们来看下echo所支持的参数和所支持的反斜线控制字符
echo支持参数:
-e :启用反斜线控制字符的转换
-n :取消行末之换行符号(与 -e 选项下的 \c 字符同义)
echo支持反斜线控制字符:
\n:NEWLINE,换行字符(常用) \t:TAB,表格跳位键(常用) \a:ALERT / BELL (从系统喇叭送出铃声) \b:BACKSPACE ,也就是向左删除键 \c:取消行末之换行符号 \E:ESCAPE,跳脱键 \f:FORMFEED,换页字符 \r:RETURN,回车键 \v:VERTICAL TAB,垂直表格跳位键 \n:ASCII 八进位编码(以 x 开首为十六进制) \\:反斜线本身
echo除了可以输出字符串内容外,结合重定向符号还可以完成很多工作。比如
(1)清空文件内容
$ echo > lion.txt
(2)创建制定内容的相关文件,比如SQL文件
$ rm -f select_username.sql $ touch select_username.sql $ echo "select username from dba_users;" >> select_username.sql $ echo "exit" >> select_username.sql
查看下select_username.sql文件内容
$ cat select_username.sql select username from dba_users; exit
(3)作为函数函数返回字符串的输出,通常return都是只能返回整数。如下
#!/bin/bash function echo_value() { [ -f select_username.sql ] && echo "Good" || echo "Bad" } return_str=$(echo_value) echo "${return_str}"
查看输出结果(select_username.sql文件刚创建是存在的,所以判定式为true):
$ ./example.sh Good
不太建议这么操作,建议还是使用全局变量去获取值。
(4)输出带颜色文字,注意这里是需要带参数-e。
#!/bin/bash
echo -e "\033[31mHello World\033[0m"
echo -e "\033[32mHello World\033[0m"
echo -e "\033[33mHello World\033[0m"
echo -e "\033[34mHello World\033[0m"
echo -e "\033[35mHello World\033[0m"
echo -e "\033[36mHello World\033[0m"
echo -e "\033[37mHello World\033[0m"
说明:30-黑色,31-红色,32-绿色,33-黄色或棕色,34-蓝色,35-紫色,36-青色,37-白色或灰色
输出结果如下:
带颜色输出可以起到强调作用,SHELL编程时常用。比如ERROR错误提示用红色告警、INFO信息提示用绿色等。再看下如何打印背景色,如下
#!/bin/bash echo -e "\033[41mI have a dream!\033[0m" echo -e "\033[42mI have a dream!\033[0m" echo -e "\033[43mI have a dream!\033[0m" echo -e "\033[44mI have a dream!\033[0m" echo -e "\033[45mI have a dream!\033[0m" echo -e "\033[46mI have a dream!\033[0m" echo -e "\033[47mI have a dream!\033[0m"
执行结果如下:
说明:40-黑色,41-红色,42-绿色,43-黄色或棕色,44-蓝色,45-紫色,46-青色,47-白色或灰色
到这里我们知道echo命令简单、实用,很多关于输出的需求都可以通过它来实现。但是如果我们想要格式化输出我们的字符串呢?想让我们输出美观一些呢?我们看一个例子
#!/bin/bash
NAME_1="Zhangsan"
ADDRESS_1="GuanDongZhangjiacun"
NAME_2="Lili"
ADDRESS_2="HaerbinLicun"
echo "NAME" "ADDRESS"
echo "${NAME_1}" "${ADDRESS_1}"
echo "${NAME_2}" "${ADDRESS_2}"
输出结果
NAME ADDRESS
Zhangsan GuanDongZhangjiacun
Lili HaerbinLicun
可以看到输出不是很美观,当然不影响功能。那么可以让输出格式化规范吗?可以,使用printf命令。我们修改下代码,如下
#!/bin/bash NAME_1="Zhangsan" ADDRESS_1="GuanDongZhangjiacun" NAME_2="Lili" ADDRESS_2="HaerbinLicun" printf "%10s : %-10s\n" "NAME" "ADDRESS" printf "%10s : %-10s\n" "${NAME_1}" "${ADDRESS_1}" printf "%10s : %-10s\n" "${NAME_2}" "${ADDRESS_2}"
查看输出结果:
NAME : ADDRESS
Zhangsan : GuanDongZhangjiacun
Lili : HaerbinLicun
可以看到字符串是格式化输出。下面我们来看下printf命令
2、printf
printf功能是格式并打印数据(format and print data),printf语法:printf format-string [arguments]
format-string为描述格式规范的字符串,arguments为参数列表,例如字符串或者变量,建议个数与format-string要求的数量相同。printf的格式指示符如下:
%c ASCII字符.显示相对应参数的第一个字符 %d,%i 十进制整数(常用) %e 浮点格式([-d].precisione [+-dd]) %E 浮点格式([-d].precisionE [+-dd]) %g %e或%f转换,看哪一个较短,则删除结尾的零 %G %E或%f转换,看哪一个较短,则删除结尾的零 %s 字符串(常用) %u 不带正负号的十进制值 %x 不带正负号的十六进制.使用a至f表示10至15 %% 字面意义的% %X 不带正负号的十六进制.使用A至F表示10至15
我们知道,echo已经可以实现我们各种输出的需求,那么我们为什么还要 使用printf呢。原因自然是printf有echo命令不具备的特性。如下
(1)从命令行引用值
printf "%s %s" "Hello" "World"
(2)格式化输出
printf "%8s %-8s %5.2f\n" "Hello" "World" "1.0"
说明:
%-8s表示一个左对齐、宽度为8个字符字符串格式,不足8个字符,右侧补充相应数量的空格符。不带符号-表示右对齐
%5.2f表示右对齐、5个字符长度的浮点数,其中一个是小数点,小数点后面保留2位
(3)使用前导0扩展输出
printf "1%06d" "123" #output 1000123
(4)与awk结合使用,如下
awk 'BEGIN{for(i=0;i<=5;i++)printf "1%02d\n",i}'
结果如下
100 101 102 103 104 105
到这里,echo和printf命令介绍结束,在使用时可以结合具体场景进行选择使用。最后我们来看一个打印提示信息的实例
#!/bin/bash # ------------------------------------------------------------------------------- # Function name: prompt_msg() # Date : 2017/04/29 # Author : 9527 # Description : Pring prompt message to screen # Usage : prompt_msg "INFO" "Hello World" # ------------------------------------------------------------------------------- function prompt_msg() { if [ $# -ne 2 ];then printf "\033[31mUsage: prompt_msg message_level message_info\n\033[0m" fi local msg_level=$1 local msg_info=$2 if [ ${msg_level} == "INFO" ];then printf "${msg_level}: ${msg_info}\n" fi if [ ${msg_level} == "WARN" ];then printf "\033[33m${msg_level}: ${msg_info}\n\033[0m" fi if [ ${msg_level} == "ERROR" ];then printf "\033[31m${msg_level}: ${msg_info}\n\033[0m" fi } prompt_msg "INFO" "INFO" prompt_msg "WARN" "WARN" prompt_msg "ERROR" "ERROR"
运行结果: