Оператор Case не работает в bash, условия не применяются

#bash

#bash

Вопрос:

Оператор Case не работает. Нажатие Enter(пустая строка) не приводит к завершению скрипта, другие случаи тоже не работают. Ни одна exit 1 команда не выполняется, когда должна, во всех случаях происходит сбой, когда я набираю текст специально для этого.

Я выясняю, какой регистр работает, но exit 1 оператор в нем не завершает работу скрипта. Как правильно завершить скрипт в этом месте?

 #!/bin/bash
...
get_virtual_host() {
    if [ -t 0 ]; then
        read -p "Create virtualhost (= Folder name,case sensitive)" -r host
    else
        # same as 'read' but for GUI
        host=$(zenity --forms --add-entry=Name --text='Create virtualhost (= Folder name,case sensitive)')
    fi
    case "$host" in
        "")            notify_user "Bad input: empty" ;      exit 1 ;;
        *"*"*)         notify_user "Bad input: wildcard" ;   exit 1 ;;
        *[[:space:]]*) notify_user "Bad input: whitespace" ; exit 1 ;;
    esac
    echo "$host"
}

host=$(get_virtual_host)
  

Дополнение для уточнения:

 notify_user () {
    echo "$1" >amp;2
    [ -t 0 ] || if type -p notify-send >/dev/null; then notify-send "$1"; else xmessage -buttons Ok:0 -nearmouse "$1" -timeout 10; fi
}
  

Комментарии:

1. Ваш вывод сохраняется в host переменной в конце командной подстановки $(..) , вы сделали echo "$host" после этого

2. Конечно, я использую эту переменную. Это работает, когда некоторый текст вводится при вводе. Однако ни одно из exit 1 не работает, когда должно.

3. $host Случайно ли в конечном итоге содержит управляющий символ? Можете ли вы cat -v <<<"$host" для отладки?

4. Я сделал. Нет управляющих символов. Проблема в другом. Я нашел вывод notify_user в stderr, но exit 1 следуя ему, не могу сделать то, что я хочу — выйти из скрипта.

Ответ №1:

Функция на самом деле написана правильно. Проблема в том, как это называется.

 host=$(get_virtual_host)
  

При захвате выходных данных команды команда выполняется в подоболочке. Выход из подоболочки напрямую не приводит к завершению родительской оболочки; родительской оболочке необходимо проверить статус выхода подоболочки.

 host=$(get_virtual_host) || exit
  

В случае get_virtual_host сбоя родительский сервер завершится. Голый файл exit без явного кода выхода пересылает существующее значение $? .