UNIX 新手指南: 一些很好的 Shell 诀窍( 四 )


使用 Shell 运算进行进制转换
假定在您的脚本中有一些数字,您需要以另外的进制处理这些数字 。使用 Shell 运算可以很容易地自动实现这类转换 。一种情况是使用 Shell 运算把一个数字从给定的进制转换位十进制 。如果数字以运算展开式的形式提供,那么假定它带有十进制符号,除非 它前面带有 0(这种情况假定是八进制)或 0x(这种情况假定是十六进制) 。键入以下内容以得到一些八进制和十六进制值的十进制输出:
$ echo $((013))
$ echo $((0xA4))
您还可以使用以下格式指定 2 到 64 之间的任意进制:
$((BASE#NUMBER))
通过在 Shell 提示符后键入清单 7 中所示的行,尝试将二进制、八进制、十六进制以及其他进制的数转换为十进制 。
清单 7. 在 Shell 中将任意进制的数以十进制输出
echo $((2#1101010))
echo $((8#377))
echo $((16#D8))
echo $((12#10))
echo $((36#ZZYY))
使用 bc 进行进制转换
在 Shell 中进行进制转换的另一个诀窍是使用 bc,它是一种任意精度运算语言,大多数 UNIX 安装程序都提供 。因为它允许您指定输出进制,所以当您需要以十进制以外的进制输出时,这是一种很好的技术 。
bc 的特殊变量 ibase 和 obase 分别包含用于输入和输出的进制的值 。缺省情况下,都被设置为 10 。要执行进制转换,需要改变其中的一个或两个值,然后提供一个数字 。立即尝试,如清单 8 中所示 。
清单 8. 使用 bc 执行进制转换
【UNIX 新手指南: 一些很好的 Shell 诀窍】$ bc -ql
10
10
obase=16
10
A
ibase=2
10
2
Control-D
$
要快速执行进制转换,可以联合使用 bc 和 echo形成快捷的单命令行程序,将给定的值通过管道传输给 bc 。键入清单 9 中显示的内容 。
清单 9. Shell 单命令行 bc 程序
$ echo 'obase=16; 47' | bc
2F
$ echo 'obase=10; ibase=16; A03' | bc
2563
$
警告:当您设置 bc 的输入进制以后,输入 bc 的所有数字都使用该进制,包括您提供用于设置输出进制的数字 。因此最好先设置输出进制,否则可能会产生意想不到的结果,如清单 10 中所示 。
清单 10. 设置输入和输出进制的先后顺序的重要性
$ echo 'ibase=16; obase=10; A' | bc
A
$ echo 'ibase=16; obase=A; A' | bc
10
$
内联输入
尽管 echo 通过管道将内容传递给交互式命令(比如 bc)可以生成快捷的单命令行程序,但是它对于多行输入并不适用,比如可能用到实际文件中的内容 。但是另外一种有用的方法可以完成这个任务 。Shell 有一种工具称为 here documents 或内联输入,这是一种动态构建文件的非常好的方法,比如用于脚本内部,并且将该文件的内容重定向到一个命令 。
使用 Shell << 操作符来指定一个 here document,然后在同一行的后面跟上一个限定字符串,该字符串标记输入的结束,并且您可以选择任何文本,只要是不包含空格字符的单个词都可以 。其后跟随构成您的输入文件的行,然后以独占一行的限定字符串结束输入,在它的前面或后面不能有任何文本,否则该行将被视为输入的一部分 。使用 cat 进行尝试,如清单 11 中所示 。
清单 11. 编写 here document
$ cat << END
> END of input text
> ENDspace
> This is still not the END
> ENDING SOON
> THE END
> END
END of input text
END
This is still not the END
ENDING SOON
THE END
$
限定字符串(本例中是 END)可以出现在输入的任何地方,只有当它以独占一行并且不含空格或其他字符的形式出现时,才表示输入的结束 。

推荐阅读