第十二章、标准输入输出
任何一个程序都有三个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停止后续输出
\eESC 键\f换页
\n新行
\r回车
\t水平制表符
\v垂直制表符
\NNNNNN 是1~3位八进制值表示的一个字节
\xHHHH 是1~2位十六进制值表示的一个字节
\uHHHHHHHH 是4位十六进制值表示的一个Unicode (ISO/IEC 10646) 字符
\UHHHHHHHHHHHHHHHH 是8位十六进制值表示的一个Unicode字符
格式化字符串中的 %s 和 %d 是占位符,s 和 d 转换符
占位符和转换符
占位符和转换符
说明
%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 宽度.精度]转换符
说明
-: 左对齐(默认是右对齐);+: 显示正号;0: 左侧空白位置补零;- 宽度 : 整个数据输出的宽度;
- 精度 : 保留小数点后多少位(默认6位)。
示例:
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 |
+------------+-----+-------+
练习:
- 写一个 Shell 脚本程序
myprint.sh,此脚本程序运行时接收两个命令行参数,第一个参数是姓名,第二个参数是年龄)。根据位置参数打印如下信息。
如输入 source myprint.sh 小魏 18打印如下:
$ source myprint.sh 小魏 18
小魏 今年 18 岁!
如输入 source myprint.sh 老魏 35打印如下:
$ source myprint.sh 老魏 35
老魏 今年 35 岁!