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

当编写 Shell 程序时,您通常会遇到一些特殊的情况,希望采用自动方式处理 。本教程包括一些关于此类情况的 Bourne Shell 脚本示例 。这些情况包括字符串的进制转换(十进制到十六进制、十六进制到十进制、十进制到八进制,等等)、在管道循环中读取键盘、Subshell 执行、内联输入、为目录中的每个文件执行一次命令,以及使用多种方法构造连续循环 。本系列文章的第 4 部分总结了一批执行有用功能的 Shell 单命令行程序 。
开始之前
了解本教程中包含的内容以及如何最好地利用本教程 。
关于本系列
本系列教程主要针对新用户撰写,简要介绍 Unix?基本概念 。本系列教程的前三篇文章站在拥有 Microsoft?Windows?背景的新用户的角度重温了一遍 UNIX 系统,讲述了文件系统和常用命令,介绍了 vi(最常见的 UNIX 编辑器),并且通过使用 grep、sed 和 awk 工具简要介绍了筛选器和正则表达式 。
关于本教程
本教程介绍了一套新用户易于掌握的诀窍和技巧 。说明在特定情况下,如何使用在 Bourne Shell 中编写的小脚本自动执行操作,包括自动执行进制转换、读取键盘输入、在 Subshell 中执行命令、为目录中的所有文件执行相同命令,以及多种形式的循环 。本教程最后以一套实用的 Shell 单命令行程序作为结束 。
目标
本教程的目标是向新用户介绍如何使用和实现许多在各种级别上提供自动化操作的 Shell 方法 。本教程通过提供针对特定情况的诀窍和技巧来说明这些方法,并且提供适用于常见任务的 Shell 单命令行程序的概要性介绍 。
先决条件
本教程面向相对不熟悉 UNIX 的用户 。唯一的先决条件是了解 UNIX 文件系统的基本知识和操作命令、命令行本身,以及能够使用类似 vi 的编辑器编写文本文件 。本系列教程的前面部分对这些概念作了全面说明 。
系统要求
您需要在带有 Bourne 兼容 Shell 环境(例如 bash)的 UNIX 系统上拥有用户级访问权限 。这是本教程唯一的系统要求 。
Shell 命令执行
学习 Shell 脚本的最佳方法是通过示例 。对于您要在脚本中执行的任何命令都可以在命令行上立即尝试,这也是本教程通篇提供大量实践示例的原因所在 。例如,echo 命令将一行文本写入到标准输出 。(许多 Shell 以内置命令形式提供其自己版本的 echo 命令,包括 IBM AIX?的 Bourne Shell 实现 。如果这也是您的现实情况,那么当您运行 echo 时,实际上正在运行您的 Shell 版本的命令 。)
引用
尝试在使用 echo 输出短消息时加引号:
$ echo "Hello, world"
Hello, world
Shell 引用(无论在命令行还是在脚本中加注)是一种将字符串传递给 Shell 的方法,可以避免对字符串中可能包含的任何特殊元字符产生混淆 。当字符串包含一个以上的单词或者段落包含空格字符时使用引用 。如果单个字符恰好是 Shell 元字符,并且您想去除它的特殊含义,就可以在两边加上引号,例如,当您要传递一个美元符号 ($) 作为字面上的美元符号字符而不是作为变量名前的特殊元字符时 。
在引用的文本内部发生各种扩展 。例如,在双引号括起来的文本中,变量被展开为它们的值,而单引号括起来的文本内部引用的变量名则不展开 。
有三种重要的引用类型需要了解:
通过在前面加反斜杠 () 引用单个字符 。这样只会传替字符的字面含义,而非它可能包含的任何特殊含义,比如空格符或 Shell 元字符 。例如,使用 * 引用一个星号 (*),它是 Shell 元字符 。要引用真正的反斜杠字符,可以使用。
通过在文本字符串两边加双引号 (") 来传递扩展的引用 。美元符号 ($) 和单引号 (') 字符会保留其自身含义 。因此,和其他字符一起在引用中出现的任何变量名都会被它们的值所替代 。新行或特定字符 ($`") 前的反斜杠被移除,但是引用的字符会被传递 。

推荐阅读