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

时间:2016-04-23 14:11:32

标签: 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" 
        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语句而不是终端?

1 个答案:

答案 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传递函数时,事情会变得难看。