参考
11、echo选项与转义序列
echo 接受 3 个参数(参见下表)。

echo 也可以接受多个以反斜线起始的转义序列(参见下表)。除了 \f,这些转义序列的行为差不多都能预测,在有些显示器上,\f 会清理屏幕,而在另一些显示器上,它会产生换行,而且在大多数打印机上会弹出纸张。



12、printf
printf 命令从 bash 2.02 就存在了,该命令分为 3 部分(除命令名之外)。
printf [-v var] format-string [arguments]
-v var 是可选的,可以将输出赋给变量 var,而不再发往标准输出。
format-string 描述了格式说明。这部分最好作为字符串常量放在引号中。arguments 是一个列表,例如,对应于格式说明的一系列字符串或变量值。
如有必要,格式会被重用,以便处理完所有的参数。如果格式要求的参数多于现有的参数,多出的那些格式说明符就假定提供的参数是 0 值或空串(视情况而定)。
格式说明前面要加上百分号(%),说明符可以是下表中的某一个。主要的格式说明符有两种,分别是用于字符串的 %s 和用于十进制整数的 %d。



printf 命令能够指定输出字段的宽度和对齐方式。格式表达式可以在 % 和格式说明符之间使用 3 个可选的修饰符。
%<flags<>width.precision<> format-specifier>
(%<标志<>宽度.精度<> 格式说明符>)
输出字段的宽度是一个数字值。如果指定字段宽度,该字段的内容默认采用右对齐。要想左对齐,必须指定 - 标志。因此,%-20s 输出的就是字段宽度为 20 个字符的左对齐字符串。如果字符串的宽度不足 20 个字符,那么会用空白字符填充该字段。以下示例将格式说明符放在格式字符串内的一对 | 之间,以看出输出字段的宽度。下面是一个文本右对齐的示例。
printf "|%10s|\n" hello@
结果为:
| hello|
接下来是一个文本左对齐的示例:
printf "|%-10s|\n" hello
结果为:
|hello |
精度修饰符用于小数或浮点数,控制着结果中的数位个数。对于字符串值来说,它控制着最多能从该字符串输出多少个字符。
你甚至可以通过 printf 参数列表中的值来动态指定宽度和精度。为此,在格式表达式中指定 *,而非字面数值。
$ myvar=42.123456
$ mysig=6
$ printf "|%*.*G|\n" 5 $mysig $myvar
|42.1235|
$
这个示例中的宽度是 5,精度是 6,要输出的值取自变量$myvar。精度是可选的,其具体含义视控制字母而定,参见下表。


%b 和 %q 是对 bash(以及其他 POSIX 兼容 shell)的补充,其提供实用特性的代价是,无法移植到其他 shell 和Unix 中的 printf 命令。以下两个示例更清晰地演示了两者的功能。
%q 的 shell 引用:
$ printf "%q\n" "greetings to the world"
greetings\ to\ the\ world
$
%b 的 echo 风格转义序列:
$ printf "%s\n" 'hello\nworld'
hello\nworld
$ printf "%b\n" 'hello\nworld'
hello
world
$
下表展示了能够在 %b 格式输出的字符串中转换的转义序列。



最后,printf 格式说明符中的字段宽度和精度之前可以加上一个或多个标志。我们已经见过用于左对齐的标志 -。其余的标志如下表所示。


以下这些 printf 用法示例用到了一些 shell 变量,如下表所示。
PI=3.141592653589



接下来还有一个无法在表格中很好呈现的示例。编写printf 语句的传统方式是,将包括换行在内的所有格式化信息全部嵌入格式化字符串。上表中就是这么做的。我们鼓励这种做法,但你并不是非得这么做,有时不这样反而会更容易些。注意,下例中的→代表输出中的制表符。
$ printf "%b" "\aRing terminal bell, then tab\t then newline\nThen line 2.\n"
Ring terminal bell, then tab → then newline
Then line 2.
最后,我们着实喜欢 bash 4.2 中引入的 %(datefmt)T,有了它,就不必创建子 shell 来调用 date 了,如下所示。
$ printf "%(%F)T\n" '-1'
2017-02-06
$ printf "%(%F_%T)T\n"
2017-02-06_20:31:25
$ printf "%(%F_%T%z)T: %s\n" '-1' 'Your log line here...'
2017-02-06_20:32:24-0500: Your log line here...
bash 得经历几次发布后才能稳定住 %(datefmt)T !有时候可以忽略 -1 参数,有时候不能,这取决于你使用的 bash 版本以及所执行的操作。为了获得最大的可移植性,不要忽略该参数。
13、用strftime格式化日期和时间
下表展示了常用的日期和时间字符串格式化选项。查询系统中 date 和 strftime(3) 的手册页,两者的选项及其含义视系统而异。







14、模式匹配字符
下表列出了 bash 中的模式匹配字符。本节中的内容摘自 Bash Reference Manual。

下面的 POSIX 字符类可以用于方括号内(详见系统 grep或 egrep 的手册页)。
[[:alnum:]] [[:alpha:]] [[:ascii:]] [[:blank:]] [[:cntrl:]] [[:digit:]]
[[:graph:]] [[:lower:]] [[:print:]] [[:punct:]] [[:space:]] [[:upper:]]
[[:word:]] [[:xdigit:]]
字符类 word 能够匹配字母、数字以及字符 _。
[=c=] 匹配所有与字符 c 拥有相同排序规则权重(由当前语言环境定义)的字符,而 [.symbol.] 则匹配排序规则符号 symbol。
这些字符类都会受到语言环境设置的影响。要想获得传统的 Unix 值,可以使用 LC_COLLATE=C 或 LC_ALL=C。
15、extglob扩展模式匹配运算符
下表中的运算符适用于使用 shopt -s extglob 时。匹配时区分大小写,但你可以用 shopt -s nocasematch(bash 3.1+)修改。该选项会影响到 case 和 [[ 命令。

16、tr转义序列
下表列出了 tr 转义序列。


17、readline的init文件语法
GNU readline 库为 bash 和其他一些 GNU 实用工具提供了命令行。其可配置性出奇得好,但大多数人并未意识到这一点。
表 22、表 23、表 24 中列出了部分可用的变量。完整的细节参见 readline 的文档。
你可以在 init 文件中使用 set 命令来更改 readline 的变量值,从而改变 readline 的运行时行为。语法很简单:
set variable value
以下示例展示了如何将默认的类似于 Emacs 风格的按键绑定更改为 vi 行编辑命令。
set editing-mode vi
在适当的情况下,变量名及其值不用区分大小写也能被识别。未识别的变量名称会被忽略。
如果布尔类型变量(可以设置为 on 或 off)的值为空、on(不区分大小写)或 1,则将其设置为 on。若是其他值,则设置为 off。
另外,启用 readline 变量 show-mode-in-prompt 时,才会显示模式字符串变量。

















18、Emacs模式命令
下表给出了一份完整的 readline Emacs 编辑模式命令清单。







19、vi控制模式命令
下表给出了一份完整的 readline vi 控制模式命令清单。





20、ASCII编码表
我们钟爱的不少计算机图书中都有一份 ASCII 图表(参见下表)。即便是在 GUI 和 Web 服务器时代,你也会惊讶地发现自己仍需要时不时地从中查找某个字符。在使用tr 命令或查找一些特殊的转义字符序列时,ASCII 显然仍有用武之地。




452



被折叠的 条评论
为什么被折叠?



