學習Unix操作系統(tǒng)外殼腳本
經過長時間的學習Unix操作系統(tǒng)的知識,這次我們來介紹關于使用外殼腳本的知識。它是典型Unix操作系統(tǒng)管理員使用命令解決的方案之一。當您要構建的包裝特別復雜時,更好的解決方案是使用外殼腳本,您可以代替原始命令調用這些腳本。使用外殼腳本,您可以更創(chuàng)造性地處理替代,甚至為另一個命令提供完全由外殼腳本驅動的替代。
使用外殼腳本的方式操作Unix操作系統(tǒng)命令
構建一致環(huán)境的最容易和最兼容的方法,是創(chuàng)建可用作實際命令的包裝的外殼腳本,這樣考慮了您希望支持的各種選項和設置。例如,Unix操作系統(tǒng)useradd 和 adduser 命令在設置參數(shù)(如用戶 ID 或組成員資格)時支持同樣的單字母命令行選項,因此 Linux 上的 $ adduser -u 1000 -G sales,marketing mcbrown 等效于 Solaris 上的 $ useradd -u 1000 -G sales,marketing mcbrown。
然而,Linux 版本還支持擴展命令選項,例如,--uid 和 --groups 等效于上面的命令行選項。這些擴展選項在 Solaris 上不受支持,但是,如果創(chuàng)建一個名為 adduser 的外殼腳本,您就可以模擬 Linux 版本,然后用適當?shù)倪x項運行實際的 Solaris useradd 命令。
例如,在Unix操作系統(tǒng)中用作 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 循環(huán),它遍歷所提供的命令行參數(shù)(在 $* 中提供)。對于每個選項,case 語句會嘗試識別該選項——使用短格式或長格式并設置一個變量。Unix操作系統(tǒng)命令行開關為 $1。如果該選項后面正常地跟著一個值(例如,用戶 ID),您可以將 $2 當作該值來進行訪問,并使用它將該值賦于某個變量。
識別出某個選項后,shift 語句從 $* 變量列表中移動一個位置(若指定了數(shù)字,則移動指定數(shù)目的位置),以便已經識別出的命令行參數(shù)在循環(huán)的下一次迭代中不再在 $* 變量中。
識別并提取出可能的參數(shù)以后,您所需做的就是構建新的選項來提供給最終要使用的命令。由于useradd/adduser 都支持短格式的參數(shù),所以可在此基礎上構建新的命令選項字符串。這是通過檢查對應的變量是否已設置并將該選項添加到命令行來實現(xiàn)的。請注意雙引號的使用,它確保了原始命令中引用的參數(shù)被保留并得到正確識別。
通過在Unix操作系統(tǒng)使用命令行工具和外殼流控制(如 if 或case)的組合,您可以使用單個源來選擇各種要使用的選項。有兩個工具在這種情況下很有用:一個工具識別主機(如 hostname 或 uname),另一個工具識別平臺 (uname)。 uname 產生的缺省輸出是基本操作系統(tǒng)名稱,如 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操作系統(tǒng)外殼腳本的知識。
【編輯推薦】