經過長時間的學習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操作系統外殼腳本的知識。