第十二章、标准输入输出

任何一个程序都有三个I/O通道: 标准输入标准输出标准错误输出。 默认 标准输入 是键盘,标准输出标准错误输出 是打印在终端上。

1. printf 命令

printf 命令是 Shell 中一个用于数据格式化成标准输出的内置命令。 printf 命令的功能和 C 语言中的 printf() 函数的功能相同。

printf 命令比 echo 命令具有更灵活的格式控制。

命令格式

printf 格式字符串 [参数 ]

示例:

weimingze@mzstudio:~$ printf "hello world\n"
hello world
weimingze@mzstudio:~$ printf "name:%s, age:%d\n" "weimingze" 35
name:weimingze, age:35

其中 printf 将第二个参数 "weimingze" 放在了 %s 占位符处,将第三个参数 35 放在了 %d 占位符处。并进行输出。

printf 命令将内容打印成标准输出,但在末尾并不会打印换行符(\n)。如果需要换行时需要在格式字符串内添加换行符。

printf 格式化字符串内可以使用的转义字符

转义字符
说明
\"
双引号
\\
反斜杠
\a
响铃
\b
退格
\c
停止后续输出
\e
ESC
\f
换页
\n
新行
\r
回车
\t
水平制表符
\v
垂直制表符
\NNN
NNN 是1~3位八进制值表示的一个字节
\xHH
HH 是1~2位十六进制值表示的一个字节
\uHHHH
HHHH 是4位十六进制值表示的一个Unicode (ISO/IEC 10646) 字符
\UHHHHHHHH
HHHHHHHH 是8位十六进制值表示的一个Unicode字符

格式化字符串中的 %s%d 是占位符,sd 转换符

占位符和转换符

占位符和转换符
说明
%s
转换为字符串。
%d
转换为有符号十进制整数。
%o
转换为有符号八进制数。
%x
转换为有符号十六进制数(小写)。
%X
转换为有符号十六进制数(大写)。
%e
转换为浮点指数格式(小写)。
%E
转换为浮点指数格式(大写)。
%f
转换为浮点十进制格式。
%F
转换为浮点十进制格式。
%g
浮点格式。 如果指数小于 -4 或不小于精度则使用小写指数格式,否则使用十进制格式。
%G
浮点格式。 如果指数小于 -4 或不小于精度则使用大写指数格式,否则使用十进制格式。
%%
不转换参数,在结果中输出一个 '%' 字符。

示例:

weimingze@mzstudio:~$ printf "https://%s.%s\n" "weimingze" "com"
https://weimingze.com
weimingze@mzstudio:~$ printf "%d\n" 1000
1000
weimingze@mzstudio:~$ printf "%o\n" 1000
1750
weimingze@mzstudio:~$ printf "%x\n" 1000
3e8
weimingze@mzstudio:~$ printf "%X\n" 1000
3E8
weimingze@mzstudio:~$ printf "%e\n" 12345.67890123
1.234568e+04
weimingze@mzstudio:~$ printf "%E\n" 12345.67890123
1.234568E+04
weimingze@mzstudio:~$ printf "%f\n" 12345.67890123
12345.678901
weimingze@mzstudio:~$ printf "%F\n" 12345.67890123
12345.678901
weimingze@mzstudio:~$ printf "%g\n" 12345.67890123
12345.7
weimingze@mzstudio:~$ printf "%g\n" 123456789.67890123
1.23457e+08
weimingze@mzstudio:~$ printf "%G\n" 123456789.67890123
1.23457E+08
weimingze@mzstudio:~$ printf "百分比:%d%%\n" 99
百分比:99%

% 和 转换符 之间的旗标语法

%[- + 0 宽度.精度]转换符

说明

示例:

weimingze@mzstudio:~$ printf "|%d|\n" 99
|99|
weimingze@mzstudio:~$ printf "|%5d|\n" 99
|   99|
weimingze@mzstudio:~$ printf "|%8d|\n" 99
|      99|
weimingze@mzstudio:~$ printf "|%-8d|\n" 99
|99      |
weimingze@mzstudio:~$ printf "|%-+8d|\n" 99
|+99     |
weimingze@mzstudio:~$ printf "|%-+8d|\n" -99
|-99     |
weimingze@mzstudio:~$ printf "|%-+8d|\n" 99
|+99     |
weimingze@mzstudio:~$ printf "|%08d|\n" 99
|00000099|
weimingze@mzstudio:~$ printf "|%f|\n" 3.1415926897
|3.141593|
weimingze@mzstudio:~$ printf "|%5.2f|\n" 3.1415926897
| 3.14|
weimingze@mzstudio:~$ printf "|%5.3f|\n" 3.1415926897
|3.142|

综合示例-打印表格

编写文件 print_table.sh,写入如下内容:

FMT="| %10s | %3d |  %3d  |\n"
printf "+------------+-----+-------+\n"
printf "|    name    | age | score |\n"
printf "+------------+-----+-------+\n"
printf "$FMT" zhang3 18 100
printf "$FMT" li4 18 88
printf "$FMT" laowei 35 60
printf "+------------+-----+-------+\n"

运行结果如下:

weimingze@mzstudio:~$ vi print_table.sh
weimingze@mzstudio:~$ source print_table.sh
+------------+-----+-------+
|    name    | age | score |
+------------+-----+-------+
|     zhang3 |  18 |  100  |
|        li4 |  18 |   88  |
|     laowei |  35 |   60  |
+------------+-----+-------+

练习:

如输入 source myprint.sh 小魏 18打印如下:

$ source myprint.sh 小魏 18
小魏 今年 18 岁!

如输入 source myprint.sh 老魏 35打印如下:

$ source myprint.sh 老魏 35
老魏 今年 35 岁!