第二章:Improving On User Commands--14.格式化长句
如果你运气不错,你的Unix系统中已经含有了fmt命令(man下试试),它是一个对于处理文本很有用的命令。从重格式化Email到在文档中填充段落(即保证每一行上要有足够多的的词)。fmt命令对于这些都很有用。但部分Unix系统并没有包含fmt命令,特别是大学里面捐赠的系统,它们一般只有很简陋的版本。最终,我们可以在一个小脚本中使用nroff命令来达到相同的效果。nroff命令是从Unix系统诞生以来就有的一个命令。
代码:
1 #!/bin/sh 2 3 # fmt的一个使用norff命令的版本。增加2个有用的选项: 4 # 行宽度:-w X 5 # 启用连字符:-h 6 7 while getopts "hw:" opt; do 8 case $opt in 9 h)hyph=1;; 10 w)width="$OPTARG";; 11 esac 12 done 13 shift $(($OPTIND-1)) 14 15 nroff<<EOF 16 .ll ${width:-72} 17 .na 18 .hy ${hyph:-0} 19 .pl 1 20 $(cat "$@") 21 EOF 22 23 exit 0
脚本如何工作:
这个简洁的脚本提供了2个不同的命令选项,-w X 用来提供一行应该最多提供X个字符(默认值是72个),-h是用来启用连字符的。注意测试起始选项的地方:一个使用getopts的while循环,然后使用shift $(($OPTIND-1))来丢弃所有已经处理过的选项参数。另外,这儿更重要的一项技术可能就是here document方法了,它用来从命令行做一个多行输入。古怪的双输入重定向符号序列 nroff<<EOF 让你轻松的使用here document,这部分的代码就好像是从命令行上输入的一样。使用here document 脚本输出所有必要的nroff命令,然后调用cat来显示。cat命令的输入接着直接提供给nroff。这是一项会时常出现在本书脚本中的技术,同样也是一项值得实验的技术!
运行脚本:
这个脚本可以被包含在一个管道中,也可以在命令行上直接给出文件名。但最常用的还是作为一个外部管道的一部分,一般是由由编辑器调用,比如vi、vim等。
运行结果:
1 ./fmt.sh -h -w 50 testLibrary.sh 2 3 ./fmt.sh testLibrary.sh
大家可以自己拿一个纯英文的文本文件试试。