我使用了以下脚本(在此网站上找到)并且无法使其正常运行。
askit () {
while true ;
do
read -r -n 1 -p "continue? [y/n] :" rep
case $rep in
[yY] ) return 0 ;;
[nN] ) return 1 ;;
* ) printf "no no, only y or n"
esac
done
}
if $(askit)
then
printf "\nWe go on, %s say.\n" $you
else
printf "\nThat's it, %s want to quit!\n" $you
break
fi
适用于" y"或" n"条目。其他条目循环返回没有终端输出。在下一个" y"或" n"结果总是错误的。
printf语句中的换行是一种遗留问题,因为无法将printf语句放在case语句中。我也尝试过回声同样的结果。
return语句似乎输出到if条件。我很确定我的语法还可以。我已经研究了fflush和stdbuf ......
问题:为什么printf输出到if语句而不是终端?
答案 0 :(得分:1)
这有几个问题:
首先,askit
函数在退出while循环或返回值之前不会返回。
如果我理解正确,您希望每次用户输入值时都打印We go on, you say
内容。
假设您在函数you
中声明了变量fun
,您可以像下面这样做:
#!/bin/bash
askit()
{
name="User"
while true
do
printf "\n%s, go to to say " $name
read -r -n 1 -p "continue?[y/n] :" rep
case $rep in
[yY]) return 0;;
[nN]) return 1;;
* ) printf "\nEnter either y or n\n" ;;
esac
done
}
if askit
then
printf "\nSuccess\n"
else
printf "\nFailure\n"
fi
其次,您不能使用$(askit)
,因为这将填充askit
函数内打印的任何if语句的其余部分。这显然不是你想要的。如果函数成功返回,您只需要确认。
问题:为什么printf输出到if语句而不是 终端
$()
是命令替换,通常用于将结果一个命令传递给另一个命令。当您使用printf
传递函数时,事情会变得难看。