#!/bin/bash main(){ # -o 注冊短格式選項,選項值為可選的選項,選項值只能緊接選項而不可使用任何符號將其他選項隔開 # --long注冊長格式選項, 如果是可選項,那選項值只能使用 = 號連接 # 選項后沒有冒號表示后面絕對不帶任何參數了,如:--help 選項; 冒號表示后面接參數值,腳本的下一個參數被解析成選項值;兩個冒號表示值可選,選項與選項值連寫表示有值,分開表示無值。
# -u, --unquoted 不用引號包裹參數,默認 getopt 會用引號包裹每個參數
set -- $(getopt -o i:p::h --long ip:,port::,help -- "$@") #選項參數 while true do case "$1" in -i|--ip) echo "ip: $2"; shift;; -p|--port) echo "port: $2"; shift;; -h|--help) echo " Usage: -i, --ip target server ip -p, --port target service port -h, --help display this help and exit "; return 0;; --) shift; break;; #這里跳出循環,-- 用作一個結束標識 *) echo "無效選項:$1";; esac shift done #剩余參數 for param in "$@" do echo "Param: $param" done } echo '正確用法1:main -i 192.168.3.1 -p3306 nginx-server nginx.conf' main -i 192.168.3.1 -p3306 nginx-server nginx.conf echo '============================' echo '正確用法2:main --ip 192.168.3.1 --port=3306 nginx-server nginx.conf' main --ip 192.168.3.1 --port=3306 nginx-server nginx.conf echo '============================' echo '錯誤用法1:main -p 3306 nginx-server nginx.conf' echo '原因: -p 是短可選項,選項與值不能分開' main -p 3306 nginx-server nginx.conf echo '============================' echo '錯誤用法2:main -p 3306 nginx-server nginx.conf' echo '原因: --port 是長可選項,選項與值只能用等號連接' main --port 3306 nginx-server nginx.conf
下面,封裝一個函數,函數實現功能是用一個文件覆蓋另一個文件。通常,我們喜歡備份配置文件,從備份中恢復,就非常簡單了。
cover default.conf.bak default.conf
cover default.conf.bak
cover -r default.conf.bak
function cover(){ set -- $(getopt -u -o rh --long rm,help -- $@) #echo $@ local rm=false for i in "$@" do case "$1" in -r|--rm) rm=true;; -h|--help) echo "cover [option] <source> [target] 功能:用一個 source 文件覆蓋 target 文件,如果省略 target,則根據 source.bak 自動推導 用法: cover source.conf target.conf cover config.conf.bak 選項: -r, --rm 刪除源文件 -h, --help 幫助"; return 0 ;; --) shift 1; break;; *) echo "無效選項:$1"; return 0 ;; esac shift 1 done local source=$1 local target=$2 [ -z "$target" ] && target="${source%.bak}" sudo bash -c "cat $source > $target" [ $rm == 'true' ] && { [ "$?" -eq 0 ] && sudo rm $source; } }