案例陈述无法在bash中使用,条件不适用

时间:2019-03-05 12:37:28

标签: bash

案例陈述不起作用。按 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" >&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 个答案:

答案 0 :(得分:3)

该函数实际上编写正确。这就是问题所在。

host=$(get_virtual_host)

当您捕获命令的输出时,该命令在子shell中运行。退出子Shell并不会直接导致父Shell退出。父外壳程序需要检查子外壳程序的退出状态。

host=$(get_virtual_host) || exit

如果get_virtual_host失败,它将退出父级。没有显式退出代码的裸exit会转发$?的现有值。