日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

標準化您的 UNIX 命令行工具( 四 )


 --comment|-c) OPT_COMMENT=$2;shift 2;;
 esac
done
OPTS=""
if [ -n "$OPT_$HOMEDIR" ]
then
OPTS="$OPTS -d $OPT_HOMEDIR"
fi
if [ -n "$GROUP" ]
then
OPTS="$OPTS -g $OPT_GROUP"
fi
if [ -n "$OPT_GROUPS" ]
then
OPTS="$OPTS -G $OPT_GROUPS"
fi
if [ -n "$OPT_SHELL" ]
then
OPTS="$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ù)(在 $* 中提供) 。對于每個選項,case 語句會嘗試識別該選項——使用短格式或長格式并設(shè)置一個變量 。命令行開關(guān)為 $1 。如果該選項后面正常地跟著一個值(例如,用戶 ID),您可以將 $2 當作該值來進行訪問,并使用它將該值賦于某個變量 。
識別出某個選項后,shift 語句從 $* 變量列表中移動一個位置(若指定了數(shù)字,則移動指定數(shù)目的位置),以便已經(jīng)識別出的命令行參數(shù)在循環(huán)的下一次迭代中不再在 $* 變量中 。
識別并提取出可能的參數(shù)以后,您所需做的就是構(gòu)建新的選項來提供給最終要使用的命令 。由于 useradd/adduser 都支持短格式的參數(shù),所以可在此基礎(chǔ)上構(gòu)建新的命令選項字符串 。這是通過檢查對應(yīng)的變量是否已設(shè)置并將該選項添加到命令行來實現(xiàn)的 。請注意雙引號的使用,它確保了原始命令中引用的參數(shù)被保留并得到正確識別 。
將該腳本安裝在支持任一種原始命令的平臺上以后,您現(xiàn)在可以添加用戶并指定所要的選項,包括對參數(shù)進行混合和匹配(請參見清單 9) 。
清單 9. 添加用戶
$ adduser.sh --homedir /etc -g wheel --shell /bin/bash -c "New user" mcbrown
同樣的基本原理也可以用于構(gòu)建其他命令的包裝,甚至更改參數(shù)名稱和選項,或者提供等效的表達式 。
如果希望用原始名稱安裝該腳本——例如,adduser——并將其放在某個目錄中(例如,/usr/local/compat),您必須確保該目錄在 PATH 中出現(xiàn)在實際命令的目錄之前 。下面是假設(shè)將兼容性腳本放在 /usr/local/compat 目錄中的一個例子:$ PATH=/usr/local/compat:$PATH 。
使用單個源
無論您是使用多個腳本還是單個配置腳本/別名來支持統(tǒng)一的環(huán)境,您也許都希望使用單獨一組腳本來支持系統(tǒng) 。因此,設(shè)置新系統(tǒng)以使用標準化腳本(無論它們是獨立腳本還是安裝外殼函數(shù)和別名)非常簡單,只需將它們復(fù)制到新系統(tǒng)即可 。
通過使用命令行工具和外殼流控制(如 if 或 case)的組合,您可以使用單個源來選擇各種要使用的選項 。有兩個工具在這種情況下很有用:一個工具識別主機(如 hostname 或 uname),另一個工具識別平臺 (uname) 。
uname 產(chǎn)生的缺省輸出是基本操作系統(tǒng)名稱,如 Linux 或 Solaris 。例如,可以按照前一部分中的 ps 示例,將該命令與 case 語句結(jié)合使用以選擇正確的別名,如清單 10 所示 。
清單 10. 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
也可以在腳本中使用同樣的基本過程來選擇特定的序列 。
在使用內(nèi)聯(lián)外殼函數(shù)時,與在每次使用函數(shù)時才做出決定相比,使用類似如此的包裝來選擇正確的函數(shù)定義通常更容易,因為這樣做會更加高效 。

推薦閱讀