经过长时间的学习Unix操作系统的知识,这次我们来介绍关于使用外壳脚本的知识。它是典型Unix操作系统管理员使用命令解决的方案之一。当您要构建的包装特别复杂时,更好的解决方案是使用外壳脚本,您可以代替原始命令调用这些脚本。使用外壳脚本,您可以更创造性地处理替代,甚至为另一个命令提供完全由外壳脚本驱动的替代。
使用外壳脚本的方式操作Unix操作系统命令
构建一致环境的最容易和最兼容的方法,是创建可用作实际命令的包装的外壳脚本,这样考虑了您希望支持的各种选项和设置。例如,Unix操作系统useradd 和 adduser 命令在设置参数(如用户 ID 或组成员资格)时支持同样的单字母命令行选项,因此 Linux 上的 $ adduser -u 1000 -G sales,marketing mcbrown 等效于 Solaris 上的 $ useradd -u 1000 -G sales,marketing mcbrown。
然而,Linux 版本还支持扩展命令选项,例如,--uid 和 --groups 等效于上面的命令行选项。这些扩展选项在 Solaris 上不受支持,但是,如果创建一个名为 adduser 的外壳脚本,您就可以模拟 Linux 版本,然后用适当的选项运行实际的 Solaris useradd 命令。
例如,在Unix操作系统中用作 adduser 或 useradd 命令的包装的示例外壳脚本。
- #!/bin/bash
- # -*- shell-script -*-
- for i in $*
- do
- case $i in
- --uid|-u) OPT_UID=$2; shift 2;;
- --groups|-G) OPT_GROUPS=$2; shift 2;;
- --gid|-g) OPT_GROUP=$2; shift 2;;
- --home-dir|-d) OPT_HOMEDIR=$2; shift 2;;
- --shell|-s) OPT_SHELL=$2;shift 2;;
- --non-unique|-o) OPT_NONUNIQUE=1;shift 2;;
- --comment|-c) OPT_COMMENT=$2;shift 2;;
- esac
- done
- OPTS=""
- if [ -n "$OPT_$HOMEDIR" ]
- then
- OPTS="$OPTS -d $OPT_HOMEDIR"
- fi
- if [ -n "$GROUP" ]thenOPTS="$OPTS -g $OPT_GROUP"
- fi
- if [ -n "$OPT_GROUPS" ]
- then
- OPTS="$OPTS -G $OPT_GROUPS"
- fi
- if [ -n "$OPT_SHELL" ]thenOPTS="$OPTS -s $OPT_SHELL"
- fi
- if [ -n "$OPT_UID" ]
- then
- OPTS="$OPTS -u $OPT_UID"
- fi
- if [ -n "$OPT_COMMENT" ]
- then
- OPTS="$OPTS -c \"$OPT_COMMENT\""
- fi
- if [ -n "$OPT_NOUNIQUE" ]
- then
- OPTS="$OPTS -o"
- fi
- CMD=adduser
- UNAME=`uname`
- case $UNAME in
- Solaris) CMD=useradd;break;;
- esac
- $CMD $OPTS $*
以上的脚本的关键是 foreach 循环,它遍历所提供的命令行参数(在 $* 中提供)。对于每个选项,case 语句会尝试识别该选项——使用短格式或长格式并设置一个变量。Unix操作系统命令行开关为 $1。如果该选项后面正常地跟着一个值(例如,用户 ID),您可以将 $2 当作该值来进行访问,并使用它将该值赋于某个变量。
识别出某个选项后,shift 语句从 $* 变量列表中移动一个位置(若指定了数字,则移动指定数目的位置),以便已经识别出的命令行参数在循环的下一次迭代中不再在 $* 变量中。
识别并提取出可能的参数以后,您所需做的就是构建新的选项来提供给最终要使用的命令。由于useradd/adduser 都支持短格式的参数,所以可在此基础上构建新的命令选项字符串。这是通过检查对应的变量是否已设置并将该选项添加到命令行来实现的。请注意双引号的使用,它确保了原始命令中引用的参数被保留并得到正确识别。
通过在Unix操作系统使用命令行工具和外壳流控制(如 if 或case)的组合,您可以使用单个源来选择各种要使用的选项。有两个工具在这种情况下很有用:一个工具识别主机(如 hostname 或 uname),另一个工具识别平台 (uname)。 uname 产生的缺省输出是基本操作系统名称,如 Linux 或Solaris。
例如,可以按照前一部分中的ps 示例,将该命令与case 语句结合使用以选择正确的别名,uname 的输出,例如 UNAME='uname'
- case "$UNAME" in
- FreeBSD|NetBSD|Darwin)
- alias ps='ps -o pid,ppid,command'
- break
- ;;
- Solaris|Linux)
- alias ps='ps -o pid,ppid,cmd'
- break
- ;;
- esac
也可以在脚本中使用同样的基本过程来选择特定的序列。这次,我们就介绍完了关于Unix操作系统外壳脚本的知识。
【编辑推荐】