12.1.1. POSIX shell 兼容性

系统中的许多脚本都可以通过任意 POSIX shell(参见 表 1.13 “shell 程序列表”)来执行。系统的默认 shell 是“/bin/sh”,它是某个实际 shell 程序的链接。

  • lenny 或更老的系统来说,它是 bash(1)

  • squeeze 或更新的系统来说,它是 dash(1)

避免编写具有 bashisms(bash 化)或者 zshisms(zsh 化)语法的 shell 脚本,确保脚本在所有 POSIX shell 之间具有可移植性。你可以使用 checkbashisms(1) 对其进行检查。

表 12.2. 典型 bashism 语法列表

好的:POSIX应该避免的:bashism
if [ “$foo” = “$bar” ] ; then …if [ “$foo” == “$bar” ] ; then …
diff -u file.c.orig file.cdiff -u file.c{.orig,}
mkdir /foobar /foobazmkdir /foo{bar,baz}
funcname() { … }function funcname() { … }
八进制格式:”\377十六进制格式:”\xff

使用 “echo“ 命令的时候需要注意以下几个方面,因为根据内置 shell 和外部命令的不同,它的实现也有差别。

  • 避免使用除“-n”以外的任何命令行选项。

  • 避免在字符串中使用转义序列,因为根据 shell 不同,计算后的结果也不一样。

[注意]注意

尽管“-n”选项并不是 POSIX 语法,但它已被广泛接受。

[提示]提示

如果你想要在输出字符串中嵌入转义序列,用 “printf“ 命令替代 “echo“ 命令。