Как сделать так, чтобы при неправильном ответе скрипт не выходил из цикла?

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

Но мне не хочется делать так:

#!/bin/bash

export PATH_FOLDER=$(xdg-user-dir DESKTOP)/dir1

folders_list=($(ls ${PATH_FOLDER}))

select opt in "${folders_list[@]}"; do
    case $REPLY in
            1) ITEM=${folders_list[$REPLY-1]} ;break ;;
            2) ITEM=${folders_list[$REPLY-1]} ;break ;;
            3) ITEM=${folders_list[$REPLY-1]} ;break ;;
            *) echo "такого нету" >&2
    esac
done

echo $ITEM

И я сделал так:

#!/bin/bash

export PATH_FOLDER=$(xdg-user-dir DESKTOP)/dir1

folders_list=($(ls ${PATH_FOLDER}))

select opt in "${folders_list[@]}"; do
    case $REPLY in
        $REPLY) ITEM=${folders_list[$REPLY-1]} ;break ;;
        *) echo "такого нету" >&2
    esac
done

echo $ITEM

Но почему-то при неверном ответе скрипт вылетает. Что делать?


Ответы (1 шт):

Автор решения: Fat-Zer

Подразумевая, что вопрос про то, как при использовании select'а обработать неправильный ввод, это можно сделать как-то так:

select opt in "${folders_list[@]}"; do
    if [ -n "$opt" ]; then
        ITEM="$opt"
        break
    else
        echo "«$REPLY» не является номером элемента в списке"
    fi
done

В случае неправильного ввода select присваивает opt пустую строку, а в случае корректного — выбранное значение из списка.

→ Ссылка