2016-04-23 153 views
1

我已经使用了下面的脚本(在这个网站上找到),并且无法让它工作。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语句而不是终端?

+0

你可以提供x-ref到你从哪里得到这个,所以原来可以改进? –

+0

欢迎来到Stack Overflow。 请注意,在这里说'谢谢'的首选方式是通过 提高投票的好问题和有用的答案(一旦你有足够的声誉这样做),并接受任何 问题最有用的答案,你问(这也给你一个小小的提升,以你的声望 )。 请参阅[关于]页面,以及[如何在此处提问 ?]和 [当有人回答我的 问题时,我该怎么办? ?](http://stackoverflow.com/help/someone-answers) –

回答

1

有几个问题与此:

首先,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的东西,然而变得丑陋。

+0

太棒了....很多newbee感谢你@sjsam。需要研究所有这些支架的东西。伟大的网站,将回来。 – Diriki

+0

@sjsam - 如果你解释了*为什么这是很好的答案。这样的解释也可能会赢得更多的赞扬。 :) – ghoti

+0

@ghoti:是的。 – sjsam

相关问题