该函数的所有功能。不过在Shell层级的版本上,会有些差异。由于printf的行为是由POSIX
标准所定义,因此使用printf的脚本比使用echo移植性好。
如同echo命令,printf命令可以输出简单的字符串:
[root@master ~]#printf "Hello, Shell\n"
Hello, Shell
[root@master ~]#
你应该可以马上发现,最大的不同在于:printf不像echo那样会自动提供一个换行符号。你必须显式
地将换行符号指定成\n。
printf命令的完整语法有两个部分:
printf format-string [arguments...]
第一部分为描述格式规格的字符串,用来描述输出的排列方式,最好为此字符串加上引号。此字符
串包含按字面显示的字符以及格式声明,格式声明时特殊的占位符,用来描述如何显示相应的参数。
第二部分是与格式声明相对应的参数列表,例如一系列的字符串或变量值。格式声明由两部分组成:
百分比符号(%)和指示符。最常用的格式指示符有两个,%s用于字符串,而%d用于十进制整数。
格式字符串中,一般字符会按字面显示。转义序列则像echo那样,解释后再输出成相应的字符。格
式声明以%符号开头,并以定义的字母集中的一个来结束,用来控制相应参数的输出。例如%s用于
字符串的输出:
[root@master ~]# printf "The first program always prints'%s,%d\n'" Hello Shell
输出结果为:
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0
'[root@master ~]#

当尝试以%d的格式来显示字符串Shell时,会发现有警告,提示Shell为无效的数字,此时会打印出
默认值0;从这个试验中可以看出来:%s, %s两侧的单引号''并不是必须的。
printf的转义序列
序列 说明
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的
参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及
任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
默认情况下,转义序列只在格式字符串中会被特别对待,也就是说,如果转义序列出现在参数列表
的字符串中,将不会被解释:
[root@master ~]#printf "a string, no processing:<%s>\n" "A\nB"

当你使用%b格式指示符时,printf会解释参数字符串里的转义序列:
[root@master ~]#printf "a string, no processing:<%b>\n" "A\nB"
无论时在格式字符串内还是在使用%b所打印的参数字符串里,大部分的转义序列都是被相同对待。
无论如何,\c与\0ddd只有搭配%b使用才有效,而\ddd只有在格式字符串里才会被解释。
现在来试试这些转义序列的效果
\a 警告字符,通常为ASCII的BEL字符
ASCII中的BEL代表的是beep,如果你在终端输入:
[root@master ~]#printf "test \a"
test [root@master ~]#
应该会听到一声beep。在我的电脑上前两天还能听到,今天测试时没有声音了,可能是系统的
设定有改变。
\b 后退
首先新建一个名为“sh_printf_b.sh”的文档,内容如下:
#! /bin/bash
printf "1";
sleep 1;
printf "\b";
sleep 1;
printf "2";
sleep 1;
printf "\b";
sleep 1;
printf "3";
sleep 1;
printf "\n"
其运行结果如下图所示:
结果如下图显示,不过每次只是出现一个数字,先是出现1,并且光标在1的右边;接着还是1,光标在1上面;
然后是2,光标在2的右边;接着还是2,光标在2的右边;然后是3,光标在3的右边;然后光标还是在3的右边跳动一下立马就退出了!

\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的
参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及
任何留在格式字符串中的字符,都被忽略
\c要与%b配合使用,请参考下图,其中%b两侧的尖括号并不是必须的:

[root@master ~]#
printf "123<%s>\n" "456"
123<456>
[root@master ~]#
printf "123%b\n" "\c456" 【\c抑制(不显示)输出结果中任何结尾的换行字符】
123[root@master ~]#
[root@master ~]# printf "123%b\n" "\n456" 【只在%b格式指示符控制下的参数字符串中有效】
123
456
[root@master ~]#
printf "123%b\n" "456" "\c213" 【因为有两个参数,第二个没有说明就不处理】
123456
[root@master ~]#
[root@master ~]# printf "123%s%b\n" "\c456" 【后面如果还有参数则被忽略】
123\c456
[root@master ~]# printf "123%s%b\n" "\c456" "\c213" 【后面的那个"\c213"被忽略了】
123\c456[root@master ~]#
[root@master ~]# printf "123%s\n%b\n" "\c456" "\c213"【这里多了个\n效果就不一样了】
123\c456
[root@master ~]#
\f 换页(formfeed)
在我系统上的效果如下:

[root@master ~]# printf "123\f456\n"
123
456
[root@master ~]#
\n 换行

\r 回车(Carriage
return)
创建一个名为“sh_printf_r.sh”的文档,内容如下:
#! /bin/bash
printf "111111111";
sleep 1;
printf "\r";
printf "2";
sleep 1;
printf "2";
sleep 1;
printf "2";
sleep 1;
printf "2";
sleep 1;
printf "2";
sleep 1;
printf "2";
sleep 1;
printf "\r"
sleep 1;
printf "3";
sleep 1;
printf "3";
sleep 1;
printf "3";
sleep 1;
printf "\n"
其运行效果如下图所示:
每次只出现一行,并且一行出现9个数字,注意光标的移动,黄色的是光标每次执行所处的位置;

\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符

[root@master ~]#
printf "\\101\n"
A
[root@master ~]#
由此我们可以知道输出的是ASCII码
printf格式指示符
项目 说明
%b 相对应的参数被视为含有要被处理的转义序列之字符串。
%c
ASCII字符。显示相对应参数的第一个字符
%d, %i 十进制整数
%e 浮点格式
%E 浮点格式
%f 浮点格式
%g %e或%f转换,看哪一个较短,则删除结尾的零
%G %E或%f转换,看哪一个较短,则删除结尾的零
%o 不带正负号的八进制值
%s 字符串
%u 不带正负号的十进制值
%x 不带正负号的十六进制值,使用a至f表示10至15
%X 不带正负号的十六进制值,使用A至F表示10至15
%% 字面意义的%
根据POSIX标准:浮点格式%e、%E、%f、%g与%G是“不需要被支持”。
这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中
需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建
于bash、ksh93和zsh中的printf命令都支持浮点格式。
printf命令可用来指定输出字段的宽度以及进行对其操作。为实现此目的,接在%后
面的格式表达式可采用三个可选用的修饰符(modifier)以及前置的格式指示符(
format specifier):
%flags width.precision format-specifier
输出字段的width为数字值。指定字段宽度时,字段的内容默认为向右对齐,如果你希望
文字向左靠,必须指定-标志。这样:“%-20s”会在一个有20个字符宽度的字段里,输出
一个向左对齐的字符串。如果字符串少于20个字符,则字段将以空白填满。下面的例子里,
|是输出,以表示字段的实际宽度。第一个例子为向右对齐文字:

下一个例子则为向左对齐文字:
precision修饰符是可选用的。对十进制或浮点数值而言,它可以控制数字出现于结果中的位数。
对于字符串值而言,它控制将要打印的字符串的最大字符数。具体的含义会因格式指示符而有不
同,如下所示:
精度的意义
转换 精度含义
%d,%i,%o,%u,%x,%X 要打印的最小位数。当值的位数小于此数字时,会在前面补零。
默认精度(precision)为1
%e,%E 要打印的最小位数。当值的位数小于此数字时,会在小数点后面
补零,默认精度为6.精度为0时则表示不显示小数点
%f 小数点右边的位数
%g,%G 有效位数(significant digit)的最大数目
%s 要打印字符的最大数目
下面是几个精度的例子:
对于转换指示符%b,%c与%s而言,相对应的参数都视为字符串。否则,它们会被解释为C语言的数字常数(
以0开头的为八进制,以0x或0X开头的为十六进制)。更进一步的说,如果参数的第一个字符为单引号或
双引号,则相对应的数值是字符串的第二个字符的ASCII值:
相关推荐
我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要...
资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...
IDEA中编写并运行shell脚本的实现 IDEA中编写并运行shell脚本的实现是指在Integrated Development Environment(IDE)中编写、配置和运行shell脚本的过程。该过程需要安装bashsupport插件,配置插件,安装git软件,...
以下是109个Shell脚本合集中的部分知识点: 1. Dos 攻击防范(自动屏蔽攻击IP) Dos攻击是指攻击者向目标主机发送大量的数据包,以耗尽主机的资源,使其无法提供服务。在这个脚本中,我们使用iptables命令来屏蔽...
Shell脚本,作为Linux/Unix系统中的编程工具,是一种强大的自动化任务执行手段。它基于Bourne shell或者其扩展版本,如bash(Bourne-Again SHell),提供了一种编写简单或复杂程序的方式,使得用户能够通过命令行...
Shell脚本编程是一种强大的编程语言,广泛应用于Linux和Unix操作系统中。本书《shell脚本编程100例》为读者提供了100个实战性的shell脚本编程实例,涵盖了检测网段主机状态、猜数字游戏、打印乘法口诀、使用rsync...
在Android系统中,由于安全性和权限的限制,直接调用shell脚本并不像在Linux或Unix环境下那样简单。然而,对于非root用户来说,确实有一些方法可以实现对shell脚本的调用,尤其是在开发和调试过程中。下面我们将深入...
shell 脚本中的通配符是 *,表示所有的字符,而 Makefile 中的通配符是 %,表示所有的字符。 其次,Makefile 中的通用函数(如 wildcard)和通配符不能在 shell 脚本中使用。在 Makefile 中,通用函数和通配符是...
Shell脚本编程是Linux系统管理中的重要技能,它允许用户自动化执行一系列命令,大大提高工作效率。以下是一些关于Shell脚本编程的关键知识点: 1. **Hello World脚本**:这是所有编程语言的基础,用于验证环境设置...
Shell脚本是一种在Unix/Linux操作系统中使用的编程语言,它允许用户通过命令行界面执行一系列操作,实现自动化任务处理。作为学习Shell脚本的指南,这本书籍旨在帮助读者深入理解Shell脚本语言的原理,掌握编写高效...
变量是Shell脚本中存储数据的基本单元。`2.2Shell变量的作用域:全局变量、环境变量和局部变量.html`将讲解变量的不同类型及其作用域,包括全局变量(在整个脚本中可见)、环境变量(可供所有子进程使用)和局部...
* 在 shell 脚本中可以使用三类命令: Unix 命令、流程控制命令和 Shell 内置命令 * Unix 命令: + `echo`:将文字容打印在屏幕上 + `ls`:文件列表 + `wc`:计算文件行数、单词数和字符数 + `cp`:文件拷贝 + ...
Shell脚本是Linux/Unix操作系统中的强大工具,它允许用户编写一系列命令,形成自动化任务,以提高工作效率。本文档收集了250个实用的Shell脚本实例,涵盖了多个应用场景,包括系统管理、安全防护、数据库备份等核心...
Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等。下面我们将介绍两种让 Android 系统或 Android 应用...
在Unity开发过程中,有时我们需要与操作系统进行交互,例如执行shell脚本来处理一些特定的任务。但在实际操作中,可能会遇到Unity无法正确调用shell脚本并传递参数的问题。本文将详细介绍如何解决这一问题,并提供一...
下面将详细介绍从给出的内容中能够总结出的一些Shell脚本编程知识点。 首先,Shell脚本编程是Linux系统管理员必备的技能之一,它允许自动化地执行许多日常任务。Shell脚本可以通过组合常用的命令行工具,比如rsync...
总结来说,这个场景涉及到了Linux下的shell脚本编写,主要是使用`exp`命令导出Oracle数据库中的数据,并通过Java程序来调用这个脚本。这在日常的运维工作中非常常见,通过这种方式可以实现自动化数据备份,提高工作...
脚本标头是Korn Shell脚本中的一个部分,用于告诉编写脚本的用户,该脚本将执行什么操作,以及该脚本的编写时间。 详细知识点: * Korn Shell脚本的基本结构:Korn Shell脚本由三部分组成:脚本标头、变量定义和...
在IT领域,Shell脚本是Linux和Unix操作系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。"shell脚本大全"这个资源可能包含了大量的示例脚本,涵盖了各种用途和场景,...
Linux_shell脚本全面学习 Linux_shell脚本全面学习