#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
без явного кода выхода пересылает существующее значение $?
.