Bash printf不输出到stdout,而是输出到函数输出。为什么?

Bash printf不输出到stdout,而是输出到函数输出。为什么?,bash,printf,Bash,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"

我使用了下面的脚本(在这个网站上找到),但很难让它正常工作

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语句中而遗留下来的。我也试过echo,结果也一样

return语句似乎正在输出到if条件语句。我很确定我的语法是正确的。我已经调查了fflush和stdbuf


问题:为什么printf输出到if语句而不是终端?

这有几个问题:

首先,在退出while循环或返回值之前,
askit
函数不会返回

如果我理解正确,您希望打印
我们继续,每次用户需要输入值时,您都会说
东西

假设您在函数
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传递一个函数时,事情会变得很糟糕。

太好了。。。。非常感谢你@sjsam。需要研究所有这些括号里的东西。伟大的网站,将会回来。@sjsam-如果你能解释为什么这是答案,那就太好了。这样的解释可能也会赢得更多的选票你能提供你从哪里得到这个的x-ref吗,这样原始的可以被改进吗?欢迎来到堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请参阅本页,以及