Bash: нет вывода цикла while и есть ли лучшее решение?

Bash: нет вывода цикла while и есть ли лучшее решение?

Я новичок в написании скриптов bash, и часть моего скрипта, приведенная ниже, не выводит никаких данных.

check=""
while [ "$check"=="" ]
do
    read -p "Signature Correct?(Yes/No): " check

if [ "$check" != "Y" || "$check" != "y" || "$check" != "Yes" || "$check" != "yes" || "$check" != "N" || "$check" != "n" || "$check" != "No" || "$check" != "no" ];
then
    check=""
elif ["$check" == "Y" || "$check" == "y" || "$check" == "Yes" || "$check" == "yes" ];
then
    echo "Signature Accepted!"
elif [ "$check" != "N" || "$check" != "n" || "$check" != "No" || "$check" != "no" ];
then
    check=""
fi
done

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

Спасибо!

решение1

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

#!/bin/bash

while true; do
    read -p 'Is signature correct? y/[n]: '

    [[ $REPLY == [Yy]* ]] && break

    echo 'Ok, asking again...'
done

echo 'Signature accepted'

Это реализует бесконечный цикл, из которого пользователь выходит, вводя строку, начинающуюся с «или» y, Yно которая по умолчанию интерпретирует ввод как «нет».

Если вам нужно проверить на Y, y, Yesи yes(т.е. обработать строки как yup«нет»), то используйте

case $REPLY in ([Yy]|[Yy]es) break; esac

вместо [[ ... ]]теста и break.

решение2

Вот два разных способа. Первый использует регулярные выражения для сопоставления «да/нет», другой использует selectвстроенную функцию:

#!/bin/bash

echo "Version 1"

check=
while [[ -z $check ]]; do
    read -r -p "Signature Correct? (Yes/No): " check
    if [[ $check =~ ^[Nn]o?$ ]]; then
        echo "Try again"
        check=
    elif [[ $check =~ ^[Yy](es)?$ ]]; then
        echo "Signature accepted"
        break;
    else
        echo "Invalid input."
        check=
    fi
done

echo "Version 2"

PS3="Signature Correct? (1 for Yes/ 2 for No): "
select opt in Yes No; do
    case $opt in
        Yes)
            echo "Signature accepted"
            break;;
        No)
            echo "Try again.";;
        *)
            echo "Invalid input."
    esac;
done

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