C.2. 不同的特性

下表显示了标准 shell (sh)、Bourne Again SHell (bash)、Korn shell (ksh) 和 C shell (csh) 之间的主要区别。

NoteShell 兼容性
 

由于 Bourne Again SHell 是 sh 的超集,因此所有 sh 命令也将在 bash 中工作 - 但反之则不然。bash 具有更多自己的特性,并且如下表所示,还包含来自其他 shell 的许多特性。

由于 Turbo C shell 是 csh 的超集,因此所有 csh 命令都将在 tcsh 中工作,但反之则不然。

表 C-2. 不同的 Shell 特性

sh bash ksh csh 含义/操作
$$$%默认用户提示符
  >| >| >! 强制重定向
> 文件 2>&1 &> file > file 2>&1 > 文件 2>&1 >& 文件 将 stdout 和 stderr 重定向到文件
  { }   { } 展开列表中的元素
`command` `command`$(command) $(command) `command` 替换封闭 command 的输出
$HOME $HOME $HOME $home Home 目录
 ~~~Home 目录符号
  ~+, ~-, dirs ~+, ~- =-, =N 访问目录堆栈
var=value VAR=value var=value setvar=value 变量赋值
exportvar exportVAR=value exportvar=val setenvvar val 设置环境变量
  ${nnnn} ${nn}  可以引用超过 9 个参数
"$@""$@""$@" 所有参数作为单独的单词
$# $# $# $#argv 参数数量
$? $? $? $status 最近执行命令的退出状态
$! $! $!  最近后台进程的 PID
$- $- $-  当前选项
. 文件 source file . file . 文件 source文件 读取文件中的命令
  alias x='y' alias x=y alias x y 名称 x 代表命令 y
case case case switchcase选择备选项
done done done end 结束循环语句
esac esac esac endsw 结束 caseswitch
exitn exitn exitn exit(expr) 以状态退出
for/do for/do for/do foreach 循环遍历变量
  set -f , set -o nullglob|dotglob|nocaseglob|noglob   noglob 忽略用于文件名生成的替换字符
hash hash alias-t hashstat 显示哈希命令(跟踪别名)
hashcmds hashcmds alias-t cmds rehash 记住命令位置
hash-r hash-r   unhash 忘记命令位置
  history history history 列出之前的命令
  ArrowUp+Enter!! r !! 重做上一个命令
  !str rstr !str 重做以上次命令开头为 "str" 的命令
  !cmd:s/x/y/ rx=y cmd !cmd:s/x/y/ 在以上次命令开头为 "cmd" 的命令中将 "x" 替换为 "y",然后执行。
if [$i-eq5 ] if [$i-eq5 ] if ((i==5)) if ($i==5) 示例条件测试
fi fi fi endif 结束 if 语句
ulimit ulimit ulimit limit 设置资源限制
pwd pwd pwd dirs 打印工作目录
read read read $< 从终端读取
trap2 trap2 trap2 onintr 忽略中断
  unalias unalias unalias 移除别名
until until until  开始 until 循环
while/do while/do while/do while 开始 while 循环

Bourne Again SHell 还有许多此处未列出的特性。此表仅供您了解此 shell 如何整合其他 shell 的所有有用想法:bash 列中没有空白。有关仅在 Bash 中发现的特性的更多信息,可以从 Bash info 页面中的 "Bash 特性" 部分检索。

更多信息

您至少应该阅读一份手册,即您的 shell 手册。首选是 info bashbash 是 GNU shell,对初学者来说最容易。打印出来带回家,在您有 5 分钟空闲时间时学习它。

如果您在理解 shell 命令方面有困难,请参阅附录 B