Вы используете ||
там, где вы должны использовать &&
; независимо от того, какое значение имеет vmProfil
, по крайней мере одно из условий !=
должно быть истинным.
while [ -z "$vmProfil" ] || <b>{</b> [ "$vmProfil" != 'Prod' ] <b>&&</b> [ "$vmProfil" != "Dev" ] <b>&&</b> [ "$vmProfil" != "Admin" ]<b>; }</b>
Вы также можете проверить отрицание результата проверки, если какое-либо условие истинно.
while [ -z "$vmProfil" ] || <b>! {</b> [ "$vmProfil" <b>=</b> 'Prod' ] || [ "$vmProfil" <b>=</b> "Dev" ] || [ "$vmProfil" <b>=</b> "Admin" ]; <b>}</b>
Я бы написал это как бесконечный l oop с явным разрывом.
while :; do
read -p '...' vmProfil
case $vmProfil in
Prod|Dev|Admin) break ;;
esac
done