Bash или условие в операторе while

Bash или условие в операторе while

Я хочу написать скрипт на bash, который проверяет пользовательский ввод на равенство "stringA" или "stringB", и в случае, если он равен одной из этих строк, он должен вывести пользовательский ввод. Мой код:

#!/bin/bash

echo "Please enter your choice (stringA or stringB): "
read result

while [[ (${result,,} != 'stringa') || (${result,,} != 'stringb') ]]; do
        echo Please enter only stringA or stringB:
        read result
done

echo "You have selected $result!"

exit

К сожалению, этот код не работает и зацикливается бесконечно. Я могу сравнить только если $resultравно одной из строк, удалив ||и вторую часть цикла while. Я попытался заменить ||на -o, но получил следующую ошибку:

./chk.sh: line 12: syntax error in conditional expression
./chk.sh: line 12: syntax error near `-o'
./chk.sh: line 12: `while [[ (${result,,} != 'stringa') -o (${result,,} != 'stringb') ]]; do' 

решение1

Это потому, что вы хотите использовать &&, а не ||.

Вы хотите повторить цикл, если результат не является stringA И не является stringB. Ни одна строка не может быть равна им обоим, что завершит ваш цикл.

Вы также можете использовать шаблон в [[ ... ]]:

while [[ ${result,,} != string[ab] ]]

решение2

#!/bin/bash

echo "Please enter your choice (stringA or stringB): "
read result

while ! [ "${result,,}" = 'stringa' -o "${result,,}" = 'stringb' ]; do
        echo Please enter only stringA or stringB:
        read result
done

echo "You have selected $result!"

exit

В текстеречь пока не результат это stringa или результат это stringb сделать...

будьте внимательны при "обращении с переменными, иначе вы получите ошибку, если переменная $resultпуста.

решение3

Проблема в вашем коде в том, что ваш цикл loops while $resultне такой же, какоба stringAи stringB(одновременно). Вы можете использовать

while [[ "${result,,}" != 'stringa' ]] && [[ "${result,,}" != 'stringb') ]]

или

until [[ "${result,,}" == 'stringa' ]] || [[ "${result,,}" == 'stringb') ]]

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

Предположение:

#!/bin/bash

PS3='Your choice: '
select result in 'stringA' 'stringB'; do
    case $REPLY in
        [12])
            break
            ;;
        *)
            echo 'Invalid choice' >&2
    esac
done

printf 'You picked %s!\n' "$result"

Запускаем это:

$ bash script.sh
1) stringA
2) stringB
Your choice: 3
Invalid choice
Your choice: 2
You picked stringB!

решение4

Вариант sh, который устранит проблемы, связанные с ${var,,}использованием локали для преобразования строк ( например, строчные буквы Iподходят не всем):i

#! /bin/sh -
while true; do
  printf %s "Please enter your choice (stringA or stringB): "
  IFS= read -r result || exit # exit on EOF
  case $result in
    ([sS][tT][rR][iI][nN][gG][aAbB]) break
  esac
  echo >&2 Invalid choice.
done

Связанный контент