linux
  • bash
  • getopt
  • 2017-02-24 157 views 2 likes 
    2

    我有一個bash文件,其中我傳遞參數,像bash腳本不分配標誌變量

    bash foo.sh update -f /var/ -v true 
    

    所以according to this answer我的腳本看起來應該像

    if [[ "$1" == "update" ]]; then 
        updater 
    fi 
    
    function updater(){ 
        verbose='false' 
        fflag='' 
        error='' 
    
    while getopts 'f:v' flag; do 
        case "${flag}" in 
        f) fflag="${OPTARG}";; 
        v) verbose='false';; 
        *) error="bflag";; 
        esac 
    done 
    
        echo $fflag 
    } 
    

    我使用的第一個腳本一個入口點,因爲我有其他功能,做其他事情,但由於某種原因,上面的腳本甚至沒有顯示的價值$fflag我試圖移出getopts循環出功能,無濟於事

    +0

    您是否正在上面運行此腳本。它實際上無法運行! – Inian

    +1

    移動零件'if [[「$ 1」==「update」]];然後 更新程序 函數調用 – Inian

    回答

    6

    有3個問題:

    1. 在一開始先定義一個函數,然後調用它在腳本
    2. 你需要傳遞命令行中使用"[email protected]"
    3. 你的函數傳遞命令行參數之前打電話shift刪除第一個參數

    你可以使用這個腳本:

    updater() { 
        verbose='false' 
        fflag='' 
        error='' 
    
        while getopts 'f:v' flag; do 
         case "$flag" in 
         f) fflag="${OPTARG}";; 
         v) verbose='false';; 
         *) error="bflag";; 
         esac 
        done 
    
        declare -p fflag 
    } 
    
    if [[ $1 == "update" ]]; then 
        shift 
        updater "[email protected]" 
    fi 
    
    +1

    下方的fi'非常感謝@Inian – anubhava

    +0

    謝謝。只是最後一個問題,如果沒有設置標誌,有沒有辦法顯示錯誤?我得到類似'option的選項需要一個參數 - ..'如果只是調用腳本 – user7342807

    +0

    你想把它叫做:'bash foo.sh update -f'?選項'f'在後面有':',所以它需要一個參數 – anubhava

    相關問題