我写了一个函数,询问用户输入如下:
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,所以当用户没有输入任何东西并按下回车时,它应该回到“是”,所以我尝试用{{1但那仍然会回到“该死的”
怎么来的?当我在函数末尾|| "$ans" == ""
时它是空的......
编辑1:
这就是:
echo $ans
这是功能:
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
答案 0 :(得分:1)
当您想要考虑许多不同的值和默认值
时,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 }
答案 1 :(得分:1)
问题在于您如何使用[[
内置编写条件。
您需要将条件更改为:
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
答案 2 :(得分:1)
只需在函数开头添加默认变量:
function is_confirmed {
ans="y"
echo "Put your choice:"
read $ans
}
如果未输入任何内容,则默认值将保留。