我试图循环询问一个问题(例如,要求确认以处理目录中的每个文件)。
这段代码完美工作:
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循环。
预先感谢您的帮助。
答案 0 :(得分:2)
要使其生效,您必须注意两件事。
首先,将< (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
我保留了其余的代码。
您还需要考虑的另一件事是,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,并且最佳做法建议改用实际文件,因为脚本应包含逻辑而不是数据。