2013-04-04 2 views
2

Попытка написать скрипт, который будет читать то, что пользователь имеет Imput ... Я знаю, что это простой, но им застрял на первый, если ..Bash, если строка = это или что

echo "Please enter yes or no (y/n)?" 
read string 
if [ $string = "y" -o "n" ] 
    then 
     echo "User selected $string" 
    else 
     echo "You didn't enter y/n !!!" 
fi 

Я хотел бы, если [$ backup = "y" или "n"]

Любые идеи?

+4

'if [" $ string "=" y "-o" $ string "=" n "]' – Erik

+2

@Erik Опубликовать это как ответ. – Barmar

+0

@Erik Пожалуйста, напишите как ответ, чтобы я мог отметить его как решенный. – bsmoo

ответ

2

Вопрос не в том, что вы на самом деле спросили, но ... Вы сказали пользователю ввести «да» или «нет», но только тест для y или n - конечно, вы дали им подсказку, но пользователи стали настойчивыми. Так что, может быть, более свободный тест в порядке:

echo "Please enter yes or no (y/n)" 
read string 
case "$string" in 
    [yY]* | [nN]*) echo "User entered $string" ;; 
    *) echo "I don't understand '$string'" ;; 
esac 

Это будет распознавать любые изменения, которые начинаются с Y или N - обычно это достаточно хорошо, но вы можете подтянуть испытания. Кроме того, так как вы, вероятно, хотите сделать что-то другое с да или нет ответа вы можете расширить дело (я также ужесточила тесты в этом один):

case "$string" in 
    [yY] | [yY][eE][sS]) echo "Here's where you process yes" ;; 
    [nN] | [nN][oO]) echo "And here you deal with no" ;; 
    *) echo "I don't understand '$string'" ;; 
esac 

Вы могли бы сделать это с помощью если заявления но я нахожу, что этот случай более читабельен, когда возможны более двух альтернатив, и тест подходит для синтаксиса случая.

2

Используйте этот синтаксис в bash:

if [ "a string" = "another one" ] ; then 

# Whatever 

fi 

Для нескольких условных операторов, таких как OR, использование:

if [ "a string" = "another one" ] || [ "$foo" = "bar" ] ; then 

# Whatever 

fi 

bash также поддерживает нестандартные [[ ... ]] выражение, которое может обработать сравнение соединение используя одну команду, а не 2 [ команд:

if [[ "a string" = "another one" || $foo = "bar" ]]; then 

# Whatever 

fi 
+1

Он хочет ИЛИ, а не И. – Barmar

+0

Я отредактировал свой ответ –

+0

Я полный новичок в bash, но удивительно '&&' работал как ** ИЛИ **! : -О – zatziky

0

Вы также можете попробовать:

echo "Please enter yes or no (y/n)?" 
read string 
if [[ "$string" =~ ^(y|n)$ ]] 
    then 
     echo "User selected $string" 
    else 
     echo "You didn't enter y/n !!!" 
fi 
0

Я хорошо решение будет с case, который легче расширить, если вы хотите, чтобы сделать ваш вклад более сложным

case $string in 
    y|n) echo "User selected $string" 
     ;; 
    *) echo "You didn't enter y/n !!!" 
     ;; 
esac 

Оттуда вы можете легко изменить его принять Прописные или любой другой:

case $string in 
    y|Y) echo "yes, Sir!" 
     ;; 
    n|N) echo "No, can't do" 
     ;; 
    *) echo "Say what?" 
     ;; 
esac 

Проверить case statements для получения дополнительной информации.

Смежные вопросы