用于用户提示的 Linux 函数



我不明白为什么我得到这个输出

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

希望这有帮助

最新更新