2016-04-23 131 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

相關問題