我不明白为什么我得到这个输出
Delete content? aas
Delete content? a
Delete content? s
Delete content? n
ATS=Please enter Y or N.
Please enter Y or N.
Please enter Y or N.
使用以下脚本
#!/bin/bash
function prompt2() {
while true; do
read -p "$1 " answer
case $answer in
[Yy] ) answer=0; break;;
[Nn] ) answer=1; break;;
* ) echo "Please enter Y or N.";;
esac
done
return $answer
}
a=$(prompt2 "Delete content? ")
echo "ATS=$a"
我希望输入错误的字符后,我会立即将行"Please enter Y or N."
打印到屏幕上,但只有在我输入其中一个预期字符后才会打印出来。此外,提示函数返回的值也是意外的。
谢谢大家的解释!对我来说(习惯于OOP(这个"工作流程"是新的东西。
命令替换捕获函数的标准输出,而不是其返回代码。
简单的非侵入性修复是在函数内部将return
更改为echo
,并将诊断消息更改为打印为标准错误(因此您不会捕获"请回答 Y 或 N"文本(。
prompt2() {
while true; do
read -p "$1 " answer
case $answer in
[Yy] ) answer=0; break;;
[Nn] ) answer=1; break;;
* ) echo "Please enter Y or N." >&2;;
esac
done
echo "$answer"
}
我还为您摆脱了愚蠢的仅限 Bash 的function
关键字。
或者,不要更改函数,并让调用代码检查返回代码。
if prompt2 "Delete things?"; then
rm -rf /
else
echo "Wise choice."
fi
因为这不是$()
在 bash 中的工作方式。
a=$(echo 'hi')
echo $a
将产生"hi",即使echo
,已完成没有错误,也将返回 0。
返回代码存储为$?
prompt2 "Delete content? "
echo "ATS=$?"
会给出你想要的答案
你很接近。 正如@tripleee所说,命令替换正在捕获标准输出。 因此,需要回声代替返回。
如果要查看错误消息,请将其重定向到标准输出
echo "Please enter Y or N." >&2
希望这有帮助