shell getopt 講解


#!/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; }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM