2014-11-24 74 views
1

我想要求用戶輸入多個問題,然後將輸入存儲在變量中,但也要確保爲每個問題輸入的輸入不是空的,否則它會重複問題多個讀取命令並檢查每個輸入的輸入

到目前爲止,我有

input() { 
     if [ ! -z "$db*" ]; then 
       echo "Nothing entered" >&2; 
       return 
     else 
       break 
     fi 
} 

read -ep 'Enter your name >> [y/N]: ' name && 
input 
read -ep 'Enter your email >> [y/N]: ' email && 
input 
read -ep 'Enter your password >> [y/N]: ' password 
input 

回答

2

使用的until語句,並檢查非空與[

until [ "$NAME" ]; do 
    printf "Name: " 
    read NAME 
done 

[ "$VAR" ]建設test命令允許你測試變量是否非空1

+1

你也可以使用'[[$ NAME]]',因爲你已經假設'bash'帶有'-p'選項來'read'。 – chepner 2014-11-24 18:33:07

+0

好點。更好地使它更便攜。 – Ray 2014-11-24 18:44:53

+0

非常感謝您的建議,直到我將閱讀更多的命令。 – programiss 2014-11-24 19:36:09

0

我使用的readeval和下列組合,其中調用所述輸入功能具有可變保存在輸入和消息要被打印(input_not_empty "INPUTVAR" "message"

input() 
{ 
    local foo 
    echo -n "$2: " 
    read foo 
    eval "$1=\"$foo\"" 
} 

input_not_empty() 
{ 
    input $1 "$2" 
    if [ -z "$(eval echo \$$1)" ]; then 
     echo "ERROR: input empty..." 
     exit 1 
    fi 
} 

input_not_empty NAME "your full name" 
input_not_empty EMAIL "your full email" 

echo "name is $NAME" 
echo "email is $EMAIL 

但請注意eval

+0

有些方法可以在不使用'eval'的情況下做到這一點。 – chepner 2014-11-24 18:36:46

+0

絕對沒有* eval的兩個*用途。 – 2014-11-24 19:04:13