2013-06-11 57 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} –