每个类似unix的操作系统上都有两种编程环境,它们都是图灵完备的,并且可以调用其他程序:awk和sh,Bourne / POSIX shell系列。AWK面向文本处理(它补充了更多的专用实用程序),而sh则面向成为将程序组合在一起的粘合语言。Sh是Linux和整个Unix世界上的通用脚本语言。
的POSIX标准定义的sh本身和相关的设施的强制特征。大多数类unix的系统都符合POSIX 1003.1-2004(又名Single Unix v3,又名Open Group Base Specification第6期);该标准的最新版本是POSIX 1003.1-2008(又名Single Unix v4,又名Open Group基本规范第7期)。
每个Linux和unix或类似Unix的系统在路径上都具有Bourne样式的外壳/bin/sh
,而任何非古色古香的系统都具有POSIX兼容的外壳(除非出现偶然的错误)。每个现代的类unix系统(包括Linux)都支持shebangs,因此/bin/sh
如果第一行是,它会自动运行in脚本#!/bin/sh
。有些POSIX系统sh
位于另一个位置(通常是OS上的仿真层,您不会认为它真的像Unix一样)。
嵌入式Linux系统可能具有未实现所有POSIX功能的精简BusyBox系统。BusyBox具有大量的编译时选项以适应小型系统,因此很难事先知道会发生什么,因此必须针对特定设备定制脚本。BusyBox是sh和各种实用程序的最常见的小型实现;您可能会遇到的另一种情况是Android中的外壳环境大大减少(以后的版本较贫乏)。
非嵌入式Linux系统几乎总是要么破折号或庆典的/bin/sh
。Dash是一个小型且快速的shell,除了POSIX功能外还实现了其他功能。Bash是具有更多功能的较大外壳。
非嵌入式Linux系统几乎总是将Bash安装为/bin/bash
。因此,为了在非嵌入式Linux系统上具有可移植性,您可以假定bash可用。bash有用的附加功能包括数组,方便处理点文件的功能,pipestatus
用于获取管道中所有命令的返回状态的变量,用于文件时间的附加比较运算符以及(在最新版本中)正则表达式匹配。
Shell编程的特征之一是您不仅在使用该sh
程序,而且还在使用许多实用程序。Linux上的大多数文件操作和文本处理实用程序都是GNU coreutils(在嵌入式系统上,它们通常来自BusyBox)。
如果您需要Linux以外的可移植性,最好的选择是坚持使用POSIX。其他unix变体可能未安装bash(bash是OSX上标准安装的一部分,但是* BSD和大多数商业unice上的可选软件包)。除Linux和OSX以外,几乎所有的unix变体(即* BSD和商用的unices)都具有Korn shell的某些版本,至少是pdksh。bash的许多方便扩展都来自ksh,因此编写可以在两者下运行的脚本会很有用,但是检测bash或ksh在未知系统上的位置可能会有些麻烦。
外壳不能做所有事情。如果您需要更复杂的语言,则可以选择两个更常见的选择:Perl和Python(其他任何作为unix脚本语言都落后的地方)。Perl是传统的脚本语言,很少有非嵌入式Linux系统缺少它,但是Python逐渐普及(在某种程度上,它是Ubuntu推荐的脚本语言)。在非Linux世界中,Perl是OSX和OpenBSD上的基础安装的一部分。它是可选的,但通常安装在FreeBSD上,并且是可选的,但通常安装在NetBSD上。
sh
。