首页 > 解决方案 > bash:不读取 if..elif 语句中的 else 语句

问题描述

我有以下脚本尝试使用 if..elif..else 语句创建菜单。但是,我的脚本永远不会在外部 while 循环中运行 else 语句,而它在内部 while 循环中工作?它应该回显“再试一次!” 按下菜单中未提及但退出循环的任何键的语句。它应该只打破循环并在按下“X”键时退出。

#!/bin/bash

while [[ 1 ]]; do

echo 1: menu1
echo 2: menu2
echo 3: menu3
echo X: exit

echo -n enter: ; read menu

if [[ ${menu} -eq 1 ]]; then
    echo menu1
    echo do something in menu1

elif [[ ${menu} -eq 2 ]]; then
    echo menu2
    echo do something in menu2

elif [[ ${menu} -eq 3 ]]; then
    while [[ 1 ]]; do
        echo 11: second menu1
        echo 12: second menu2
        echo 13: exit

        echo -n enter number: ; read second_menu

        if [[ ${second_menu} -eq 11 ]]; then
            echo do something in second menu1
        elif [[ ${second_menu} -eq 12 ]]; then
            echo do something in second menu2
        elif [[ ${second_menu} -eq 13 ]]; then
            break
        else
        echo try again second_menu!
        fi
    done

elif [[ ${menu} -eq 'x' ]] || [[ ${menu} -eq 'X' ]]; then
    break
else
    echo try again menu!
fi
done

标签: bashif-statement

解决方案


[[行为不端。认为这[[ k -eq x ]]是真的,因为 -eq 是一个整数比较,并且这两个字符串都计算为整数 0。(我说它的行为不好,因为这里的良好行为会产生错误消息。)

使用=or 一个 case 语句 ortest代替[[. (个人观点,完全避免[[。它缺少错误信息是一种讽刺,使其完全无法使用。)


推荐阅读