2013-06-11 81 views
1

我寫了詢問類似這樣的用戶輸入的功能:zsh - 用默認值讀取用戶輸入 - 空輸入不爲空?

function is_confirmed { 

    read -rs -k 1 ans 

    if [[ "${ans}" == "n" || "${ans}" == "N" ]]; then 
     printf "No\n" 
     return 1 
    fi 

    if [[ "${ans}" == "y" || "${ans}" == "Y" ]]; then 
     printf "Yes\n" 
     return 0 
    fi 

    # here is my actual problem!!! this doesnt work when user input is blank! 
    if [[ "${ans}" == "" ]]; then 
     printf "Yes!\n" 
     return 1 
    fi 

    # Output is Damn! 
    printf "Damn" 
    return 1 
} 

的偉大工程,到目前爲止,不過,我想設置成「yes」作爲默認answear,所以當用戶輸入什麼,只是按下回車,它應該回落到「是」,所以我嘗試了|| "$ans" == ""但仍然回落到「該死」

怎麼回事?當我在echo $ans它是空的函數的結尾......

編輯1:

這是發生了什麼:

e_ask "Are you sure you want to install?\nWarning: This may override some files in your home directory." 

if is_confirmed; then 
    echo "Great!" 
else 
    e_error "Aborting..." 
fi 

這裏的功能是:

function e_ask { 
    printf "\n$1\n" 
    printf "(Y/n): " 
} 

function e_warn { 
    printf "Warning: $1\n" 
} 

function e_error { 
    printf "Error: $1\n" 
    exit 1 
} 

回答

1

A case比較好,當你想考慮許多不同的值和默認值時

function is_confirmed { 

    read -rs -k 1 ans 

    case "${ans}" in 
    y|Y|$'\n') 
     printf "Yes\n" 
      return 0 
     ;; 

    *) # This is the default 
     printf "No\n" 
      return 1 

    esac 

}
+0

這並不能解決我的問題。當我沒有在shell中輸入任何內容,只需按回車,以便$ ans應該是一個空字符串,'$ ans ==「」''仍然會回到「該死」。 –

+0

@MartinBroder對不起,我誤解了。如果你輸入'N'或'n',你想輸出「No」;如果輸入'y','Y'或什麼都不輸入,輸出「Yes」在這種情況下,您只需更改默認情況,或者用'y | Y |「」'替換'y | Y'。 – giordano

+0

沒問題, 嗯是的,當我輸入'Y','Y',「」和「否」時,如果它是'N',''n'或其他任何東西('a', 'b','c' ...) –

0

問題在於如何使用內建的[[編寫條件。

您需要更改條件:

function is_confirmed { 

    read -rs -k 1 ans 

    if [[ "${ans}" == "n" ]] || [[ "${ans}" == "N" ]]; then 
     printf "No\n" 
     return 1 
    else if [[ "${ans}" == "y" ]] || [[ "${ans}" == "Y" ]]; then 
     printf "Yes\n" 
     return 0 
    else if [[ -z "${ans}" ]]; then 
     printf "Empty\n" 
    else 
     printf "Damn\n" 
    fi 

    return 1 
} 

爲了解釋,該[[內置的測試只是一個條件,但你可以&&||[[鏈的多個實例。相反,您的代碼試圖在[[內測試2個條件,並使用||,因爲它是C/C++的用法。在help [[man bash

+0

多數民衆贊成在沒有問題:) 當我添加[[「$ ans」==「」]]'是的答案,當用戶輸入什麼都沒有,它回落到「該死」 ,在那裏我會懷疑它會回落到是 –

+0

@MartinBroder我已經添加了條件,以防''ans'是空的並且不是上述情況。根據需要添加您的作業。 – Samveen

+0

不起作用:(我更新了我的問題 –

1

可用

更多細節只添加的功能開始默認變量:

function is_confirmed { 

    ans="y" 

    echo "Put your choice:" 
    read $ans 


} 

如果沒有被鍵入,默認值將保持不變。

+0

Upvoted(terse!),但是這有一個嚴重的缺陷:READ似乎預先清除了答案。 「公鑰文件的路徑(爲$ KEYPATH留空)?」 read -rt 20 -p「公鑰文件[$ KEYPATH]的路徑?」KEYPATH [[-f $ KEYPATH]] || echo「Not a file:$ KEYPATH。Exiting。「如果$ KEYPATH與'read'調用一致,Bash會抱怨標識符無效,我不得不使用默認表示法和另一個var:'DEFAULT_KEYPATH =」$ HOME/.ssh /id_rsa.pub「 read -rt 20 -p」公鑰文件的路徑[輸入爲$ DEFAULT_KEYPATH]?「INPUT KEYPATH = $ {INPUT: - $ DEFAULT_KEYPATH} –