2016-04-04 77 views
-1

我已經使用以下代碼停留了相當長的一段時間。它可以工作,但變量會丟失迭代期間設置的值。在for循環中使用管道。如何在for循環中保留變量的值

我有以下代碼

mistakes=0 
    entered_chars=() 


word_length=0 
answer="" 
answer_guess="" 


checkIfLetterInsideWord(){ 

exists=0 
letter=$2 

    word_array=`echo $1 | grep -o . `; 

for ((i=1; i <= $word_length; i++)) 
    do 
     if [[ "${1:$i-1:1}" = ${letter} ]]; then 

      exists=1 

      answer_guess=$(echo $answer_guess | sed "s/-/${letter}/{i}") 

     fi 

done 

echo $exists 

} 

askUserInput(){ 

    answer=$answer 
    echo $answer 
    echo "Please type a letter" 
    read user_input 


    if [ ! -z $user_input ]; then 

    user_input=$(echo $user_input | tr '[:upper:]' '[:lower:]') 

    if [ $(checkIfAlreadyEntered "$user_input") -eq 0 ]; then 

     if [ $(checkIfLetterInsideWord $answer $user_input) -eq 0 ]; then 
     mistakes=$((mistakes + 1)); fi 

     echo "Current mistake count; $mistakes " 

     entered_chars+=($user_input) 

    else 
     echo "Char has already been entered" 
    fi 
else 
    echo "You haven't entered any input!" 
fi 

} 


guessTheWord() { 

answer=$OPTARG 
word_length=$(printf $answer | wc -m) 

temp=$(echo $answer | sed 's/\(.\)/\1 /g') 
array=($temp) 


echo "The chosen word is $word_length long" 

gameOngoing=true 


     for((i=1; i<=$word_length; i++)) do 
      answer_guess="$answer_guess-" 
    done 



while $gameOngoing 
do 

echo $answer_guess 

askUserInput $answer  



done 




} 

我想保留變量answer_guess的價值。我明白,由於在循環內部使用了一條管道,它會失去價值,但我不知道要解決這個問題。

+5

在該代碼段沒有什麼會導致'answer_guess'被丟棄的價值。請提供一個[mcve]來演示您希望解決的問題。 – rici

+2

'answer_guess'除了'sed'外沒有賦值。如果在第一次迭代時它是空的,那麼對於所有其他的將是空的。你的'sed'行是可疑的,當它應該是一個''''時你有一個'''',爲什麼你有'{i}'?這對我的'sed'版本無效,因爲你要替換的字符,你不需要區分大小寫的替換。 – cdarke

+0

對不起,這是一種錯誤的類型) 我使用{i}作爲索引,answer_guess是一個填充的變量。我創建的是一個hang子手遊戲,並且最初,answer_guess包含值'-----' 我正在做的是取代 - 用正確的猜測字母 – Trickflick

回答

0
answer_guess=$(echo $answer_guess | sed "s/-/${letter}/{i}") 

取代 - 與。

使你的代碼變得

answer_guess=$(echo $answer_guess | sed "s/./${letter}/{i}") 
2

該問題與管道無關。相反,它是在命令替換($(...))內部調用checkIfLetterInsideWord。命令替換在子shell中執行,因此函數中的環境更改不會持續。

最好重寫checkIfLetterInsideWord,這樣返回退出狀態。喜歡的東西:

if [[ $exists ]]; then 
    return 0 # Success 
else 
    return 1 # Failure 
end 

然後,你可以簡單地調用它,而不用擔心子shell:

if checkIfLetterInsideWord "$answer" "$user_input"; then 
    # letter is in word 
else 
    # letter is not in word 
fi 

沒有與代碼等問題。我已經將這個答案限制在保留變量值的問題上。

+0

你的方法是合乎邏輯的並且合理。我很抱歉我遲到的迴應,但我會把你的解釋作爲一個有益的教訓。再一次感謝你。 – Trickflick