Чтобы немного расширить ответ анубхава в:
arr=(Mon Tue Wed Thus Fri Sat Sun)
read -p 'Enter day value: ' day
case "${arr[@]}" in *"$day"*) echo "in range";; esac
В основном, это строит массив, превращая его в строку, и делать сопоставление с образцом на нем.
В контексте выражения case
нет никакой разницы между "${arr[@]}"
и "${arr[*]}"
; Я лично придерживаюсь *
, что дает понять, что вы строите одну большую строку вместо списка отдельных.
С помощью этого определенного набора значений вам не нужно беспокоиться о перекрытии подстроки, но вышеуказанная проверка все еще слишком прощает. Например, если вы введете u
, это будет считаться «в диапазоне». Возможно, это не то, что вы хотите.
Более точное испытание было бы что-то вроде этого:
case "${arr[*]}" in
"$day "*|*" $day "*|*" $day") echo "in range";;
*) echo "not in range";;
esac
Это все еще позволяет пользователю ввести несколько дней, как «Mon Tue» или аналогичный; простой способ исправить это в этом конкретном случае - изменить линию read
от read day
до read day _
.
Образец "$day "*
будет соответствовать в начале массива (так что если в этом случае они вводят Mon
). Образец *" $day"
будет соответствовать в конце массива (Fri
), а шаблон *" $day "*
будет соответствовать остальным. Ничего другого, кроме точной строки дня, не будет соответствовать.
Кроме того, здесь вы можете увидеть, как обрабатывать else
случая - картина *
матчи ничего, что уже не согласованное что-то еще, так что это эквивалент else
в case
.
Это единственный безопасный ответ. Кроме того, это самый чистый и самый короткий. Спасибо, Чэпнер за хорошие ответы! –
К моему удивлению, 'shopt -s extglob' на самом деле не нужен, даже в 3.2. Замечания о выпуске 4.1 указывают, что 'extglob' временно включается внутри' [[...]] '" для совместимости ", который, как представляется, намекает на то, что такие шаблоны всегда являются расширенными шаблонами, даже если они явно не документированы как таковые. (Что имеет смысл, вам не нужна совместимость шаблонов POSIX внутри конструкции, отличной от POSIX, и шаблоны соответствуют строкам, а не именам путей.) – chepner
Ах да, вы правы! Вы можете отменить мое редактирование (извините за это). –