2014-03-28 63 views
-1

正如預期的那樣,這會將「testEmpty」文件的每一行都打印到控制檯。循環中bash腳本內部的變量聲明

while read i; do 
    echo $i 
done < testEmpty 

....但這:

while read i; do 
    name=$i 
    echo $name 
done < testEmpty 

只打印出空白行。

我這樣做的原因是因爲在'testEmpty'文件的每一行都有一個URL,我在這個while循環中進行卷曲(爲了清晰起見刪除),我希望將文件擴展名附加到作爲一個文件名的URL的一部分,我認爲這將是相當整潔的做同樣的循環。

順便說一句'testEmpty'文件應該只有一個或兩個條目,所以我不會爲開銷等問題困擾,如果我正在處理大文件,我認爲這可能是一個問題,所以我沒有需要擔心這一點。

謝謝

+0

請輸入您的樣本文件和慾望輸出 –

+0

你嘗試「而讀我,做名= $ I;回聲$我;做了 lanes

+0

對於我上面給出的代碼,我期望2個循環做同樣的事情 - 將'testEmpty'文件的每一行打印到控制檯。一旦我找出他們爲什麼不這樣做,我將如何改變'我'並將結果提供給'名稱'作爲文件名 – user1587462

回答

0

這種形式

name=$i echo $name 

之前將替代變量啓動命令,所以當echo實際運行時,bash認爲

name="contents of the line" echo 

而且,你贏了」 t得到之前的行的值,因爲var=value cmd ...僅在命令的持續時間內在命令的環境中設置了var變量。

你需要確保你想要解除引用之前的變量被設置:

name=$i; echo $name 
# or if you're launching some other command, protect the variable: 
name=$i sh -c 'echo $name' 
+0

這項任務是分開的;在原來的職位缺乏縮進隱藏。 – chepner

+0

@chepner是的,當我發佈時,我還沒有意識到。爲此道歉。 – user1587462

+0

哦。那麼在那種情況下,除了缺乏引號外,我不明白它爲什麼「不起作用」。 –

2

@CharlesDuffy了它,當他建議用SED是不是做字符串操作的正確方法。簡單問題的答案是這樣的:

while read i; do 
    name=${i} 
    echo $name 
done < testEmpty