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