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


一些用户对它们的 Shell 进行配置,从而使 PATH 变量包括当前的工作目录,这在 Path 中以点字符 (".") 表示 。如此一来,要在当前目录下运行脚本,只需要键入它的名称,不需要指出相对目录 。,Shell 按给定的顺序搜索 Path中的目录,从而避免中木马或发生异常情况,一种极其不明智的做法是把当前工作目录放在 Path 的末尾 。
要查看您的 Path,可以使用 echo 显示 PATH 变量的内容,如清单 4 所示 。
清单 4. 更改 PATH
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11
$ myscript
myscript: command not found
$ PATH = $PATH":."
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.
$ myscript
The message is 'Hello, world!'
$
在解释器名称的后面可以附加特殊选项或标志,比如 /usr/bin/bsh -n,这用于调试目的 。连字符关闭选项,加号则打开选项 。特殊的内置环境变量 -(一个连字符)包含当前 Shell 的完整选项列表 。
尝试在您当前的交互式 Shell 中设置了哪些选项 。通过使用 echo 显示 - 变量的内容来完成这项任务:
$ echo $-
himBH
$
参考您使用的 Shell 的 man 页面来获取当前的标志和选项列表 。表 1 提供了 AIX?上的 Bourne Shell 的常用标志列表,以及对每种标志作用的简要说明 。
表 1. AIX Bourne Shell 的常用选项
标志描述-a 导出所有已分配值的变量 。-c Variable 执行从变量 中读取的命令 。-e 当命令满足以下条件之一时立即退出:命令退出时返回比 0 大的值;命令不是 while、until 或 if 结构的一部分;命令不经过 AND 或 OR 检测;或者命令不是管道前加感叹号 。-f 禁用所有文件名替换 。-h 定义函数时,定位和记住函数内部调用的所有命令 。-i 指定交互式 Shell 。-k 将所有关键字 都放入命令的环境 。-n 读取命令,但是不执行它们 。-r 调用受限制的 Shell 。-s 从标准输入读取命令,然后将输出写入标准错误(不包括 Shell 内置命令的输出) 。-t 读取并执行单个命令,然后退出 。-u 在脚本中,将所有未定义 变量视为错误 。当尝试变量替换时退出 。-v 当读取输入行时将其显示出来 。-x 在执行命令之前显示其完整命令(包括所有的参数和选项) 。
Shell 运算和进制转换
Shell 提供大量的基本运算操作,在脚本中非常有用 。Shell 对您提供的算术表达式求值,执行运算展开式,此时使用得出的结果替换表达式 。以下面的格式提供运算表达式:
$(( expression ))
您可以使用 echo 在命令行显示运算展开式的结果,了解其工作情况 。现在尝试清单 5 所显示的结果 。
清单 5. Bourne Shell 中的运算展开式
$ echo $((10 40))
50
$ echo $((5*(3 3)))
30
您还可以将展开式分配给变量 。尝试清单 6 所显示的结果 。
清单 6. 将运算展开式分配给 Shell 变量
$ myvar = 10
$ echo $myvar
10
$ echo $(($myvar-2))
8
$ myvar = $(($myvar 5))
$ echo $myvar
15
$ result = $(($myvar-10))
$ echo $result
5
$
表 2 列出了在大多数 Bourne 以及与 Bourne 兼容的 Shell中可以使用的运算符 。正如上面第二个示例,使用圆括号括起来的语句有更高的优先级 。实际上,Shell 算术优先级通常根据 C 语言的规则来确定 。
表 2. Shell 条件表达式
运算符描述加- 减* 乘/ 除% 求余< 小于(1 代表真,0 代表假)<= 小于等于(1 代表真,0 代表假)> 大于(1 代表真,0 代表假)>= 大于等于(1 代表真,0 代表假)<< 按位向左移位:将给定的整数或第一个表达式向左移动第二个表达式表示的位数>> 按位向右移位:将给定的整数或第一个表达式向右移动第二个表达式表示的位数

推荐阅读