printf不输出到标准输出,而是输出到函数。为什么?
问题描述:
我已经使用了下面的脚本(在这个网站上找到),并且无法让它工作。printf不输出到标准输出,而是输出到函数。为什么?
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语句中的换行符是不能在case语句中放入printf语句的遗留问题。我也尝试过回声以及相同的结果。
return语句似乎输出到if条件。我很确定我的语法没问题。我已经看过fflush和stdbuf ...
问题:为什么printf输出到if语句而不是终端?
答
有几个问题与此:
首先,askit
功能将不会返回,直到你退出while循环,或者返回一个值。
如果我理解正确,您希望每次用户需要输入值时打印We go on, you say
东西。
假设你具备的功能fun
内声明的变量you
你可以做象下面这样:
#!/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)
,因为这会从任何填充if语句的其余部分,就打印askit
功能。这显然不是你想要的。如果函数成功返回,您只需要确认。
问题:为什么printf输出到if语句而不是 终端?
$()
是命令替换,通常用于将结果一个命令传递给另一个命令。当你通过一个函数printf
的东西,然而变得丑陋。
你可以提供x-ref到你从哪里得到这个,所以原来可以改进? –
欢迎来到Stack Overflow。 请注意,在这里说'谢谢'的首选方式是通过 提高投票的好问题和有用的答案(一旦你有足够的声誉这样做),并接受任何 问题最有用的答案,你问(这也给你一个小小的提升,以你的声望 )。 请参阅[关于]页面,以及[如何在此处提问 ?]和 [当有人回答我的 问题时,我该怎么办? ?](http://stackoverflow.com/help/someone-answers) –