我不明白为什么会得到这个输出
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)而言,这种“工作流程”是新事物。
答案 0 :(得分:3)
命令替换捕获功能的标准输出,而不是其返回代码。
简单的非侵入式修复是将函数内的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
答案 1 :(得分:1)
因为这不是$()
在bash中的工作方式。
a=$(echo 'hi')
echo $a
即使echo
正确完成,也将返回0。
返回码存储为$?
prompt2 "Delete content? "
echo "ATS=$?"
将给出您想要的答案
答案 2 :(得分:0)
您很近。正如@tripleee所说,命令替换正在捕获标准输出。因此,需要用回声代替返回值。
如果您想查看错误消息,请将其重定向到标准输出
echo "Please enter Y or N." >&2
希望这会有所帮助