模仿DIR环境脚本
很多计算机爱好者是从Unix或是Linux操作系统学起的,然而还有很多人是从别的系统学起的,使用不同的命令、不同类型的交互方式。比如说,很有可能你公司的员工更习惯于使用DOS命令,而不是一个shell的解提示器。使用一系列的alias可以稍微减少一点这种差异,比如说将dos命令映射城unix的ls命令:
alias DIR=ls
但如果用户学习过在dos下/w表示宽列表格式的话,这种映射就没什么效果了。因为unix命令会警告没有/w目录。取而代之,像之前写的那些改变输入的封装器一样,接下来的DIR脚本就是用来映射一种类型命令选项到另一种环境中去。
代码:
01
#!/bin/sh
02
03
# DIR.sh -- 假装我们正使用DOS的dir命令
04
# 使用dir命令显示给定文件的内容,该命令可接受标准的dir选项
05
06
function usage
07
{
08
cat << EOF >&2
09
Usage: $(basename $0) [DOS flags] directory or directories
10
where:
11
/D sort by columns
12
/H show help for this shell script
13
/N show long listing format with filenames on right
14
/OD sort by oldest to newest
15
/O-D sort by newest to oldest
16
/P pause after each screenful of information
17
/Q show owner of the file
18
/S recursive listing
19
/W use wide listing format
20
EOF
21
exit 1
22
}
23
24
postcmd=""
25
flags=""
26
27
while [ $# -gt 0 ]
28
do
29
case $1 in
30
/D) flags="$flags -x";;
31
/H) usage;;
32
/[NQW]) flags="$flags -l";; # 正则表达式
33
/OD) flags="$flags -rt";;
34
/O-D) flags="$flags -t";;
35
/P) postcmd="more";;
36
/S) flags="$flags -s";;
37
*) break; # 未知选项:可能是一个文件描述符;所以退出循环
38
esac
39
shift
40
done
41
42
if [ ! -z "$postcmd" ]; then
43
ls $flags "$@" | $postcmd
44
else
45
ls $flags "$@"
46
fi
47
48
exit 0
脚本如何运行:
这个脚本突出了一个真相:shell脚本中的case语句事实上是正则表达式,这个特性非常有用。你可以看到在dos中的/N、/Q、/W选项都被映射到了unix中ls命令的-l选项上。
理论上用户应当被授予unix环境中的语法和选项,但那并不一定是必须的。当然,在调用这个脚本前可以查看脚本中的帮助选项来了解所有的映射选项。
运行脚本:
将脚本命名为DIR.sh,当用户在命令行上键入典型的DOS命令选项时,就会产生一个有意义的输出,而不是以前的那种错误信息:command not found
运行结果:
01
$ DIR /OD /S /Volumes/110GB/
02
total 60680
03
0 WEBSITES 64 Desktop DB
04
0 Writing 0 Temporary Items
05
0 Microsoft Office X 29648 Norton FS Volume 2
06
0 Documents 29648 Norton FS Volume
07
0 TheVolumeSettingsFolder 0 iTunes Library
08
0 Trash 8 Norton FS Index
09
816 Norton FS Data 0 Desktop Folder
10
496 Desktop DF 0 Desktop Picture Archive
这个目录下的排序方式是从最旧的到最新的,同时显示了文件大小。