循环选择不要求输入

时间:2018-09-05 22:26:21

标签: bash select reply

我试图循环询问一个问题(例如,要求确认以处理目录中的每个文件)。

这段代码完美工作:

PS3="Dummy question ? "
select CHOICE_MADE in "Ans1" 'Ans2' 'Ans3'; do
    if [[ -n ${CHOICE_MADE} ]]; then
        printf "Choice made : %s\n" "${CHOICE_MADE}"
        break;
    fi
done

我需要循环这个问题(注意,我将变量命名为循环变量,以避免使用默认的$ REPLY变量):

while read -r TOTO; do
    PS3="Dummy question ? "
    select CHOICE_MADE in Ans1 Ans2 Ans3; do
        if [[ -n ${CHOICE_MADE} ]]; then
            printf "Choice made : %s\n" "${CHOICE_MADE}"
            break;
        fi
    done
done < <(echo Step1 Step2)

选择不会提示任何内容。

我不想使用whiptail(遮罩脚本先前的输出),dialog(需要在debian上安装)或任何gui。

我知道我可以使用read解决我的问题,但是我想保留select循环。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

要使其生效,您必须注意两件事。

1)错误使用了“ stdin”

首先,将< (echo Step1 Step2)传递到您的while周期,您正在使用stdin,这就是为什么提示根本不等待任何输入的原因(已经有提示了) !)。

您可以使用file descriptors摆脱它:

exec 3< <(echo Step1 Step2) ### Create fd "3" and put output of echo in it
while read -r TOTO <&3; do
    PS3="Dummy question ? "
    select CHOICE_MADE in Ans1 Ans2 Ans3; do
        if [[ -n ${CHOICE_MADE} ]]; then
            printf "Choice made : %s\n" "${CHOICE_MADE}"
            break
        fi
    done
done
exec 3>&- ### clean fd 3

我保留了其余的代码。

2)错误使用“读取”

您还需要考虑的另一件事是,read -r将逐行读取您给他的内容,而简单的echo Step1 Step2将仅产生一行,因此您只需要循环浏览一次即可。一次出现。

为了摆脱这种不良行为,您将不得不使用其他解决方案。

目前我能想到的一个解决方案是heredoc

exec 3<< EOF
Step1
Step2
EOF
while read -r TOTO <&3; do
    PS3="Dummy question ? "
    select CHOICE_MADE in Ans1 Ans2 Ans3; do
        if [[ -n ${CHOICE_MADE} ]]; then
            printf "Choice made: %s\n" "${CHOICE_MADE}"
            break
        fi
    done
done
exec 3>&- ### clean fd 3

请注意,建议不要使用多个Heredoc,并且最佳做法建议改用实际文件,因为脚本应包含逻辑而不是数据。