2015-06-17 28 views
0

我不知道爲什麼這段代碼停止工作 我測試了它幾次,它運行得很好 我試圖做的事聽到的是第一和第二在2點不同的陣列 ,然後比較參數$ 2 ==>在陣列內翻,如果它是在數組中,我不想將它存儲在文本文件$文件保存在數組中,並將參數與bash中的數組進行比較

comment=$2 
dueD=$3 
x=0 

hasData() 
{ 
    declare -a varA varB 
    cat $file | while IFS=$'\t' read -r num first second;do 
     varA+=("$first") 
     varB+=("$second") 
     done 

    if [[ ${varA[@]} == ~$comment ]]; then 
     echo "already in the Todo list" 
    else 
     x=$(cat $file | wc -l) 
     x=$(($x+1)) 
     echo -e "$x\t$comment\t$dueD" >> $file 
    fi 

我覺得我是$評論將錯誤值存儲在陣列中,因爲當我嘗試時

echo ${varA[@]} 

沒有獲取印刷 多了,我認爲我的if語句是不夠準確的,因爲這是第四次我編輯它和它的作品,但一段時間後它不再起作用 需要幫助,懇請

+0

你的管道創建一個子shell。因此,對'varA'和'varB'的賦值發生在子shell中,並在子shell退出時立即丟失。有關如何在沒有子shell的情況下執行此操作,請參閱http://mywiki.wooledge.org/BashFAQ/001。 –

+0

也是你的[[''比較奇怪,可能不是你真正想要的。右邊的'~'可能是字面的(你的意思是'=〜'用於正則表達式比較)?另外,您正在匹配'varA'的所有內容,這意味着您可能會在*條目之間匹配*(即一個條目的結尾和另一個條目的開頭)。如果你想搜索數組中的條目,你需要循環和單獨比較或使用關聯數組(bash 4+)。或者,不要完全讀取該文件,並使用'grep'或類似命令檢查匹配項。 –

+0

@EtanReisner感謝您的指導,但是如果您可以告訴我,鏈接上的什麼解釋了子殼以及如何恢復它們,因爲我找不到它 – Hazo

回答

0

你的管道創建子shell。因此,您在varAvarB的分配發生在子外殼中,並且在子外殼退出後立即丟失。有關如何在沒有子外殼的情況下執行此操作,請參見How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?。 - Etan Reisner
看看那裏的解決方案。看看他們如何不使用管道?這就是解決方案:不要使用管道。使用其他輸入重定向選項之一。 - Etan Reisner

相關問題