2012-03-14 42 views
1

我有一個代碼片段,如下所示。可以在while循環中變得可控嗎? (在bash中)

#!/bin/bash 
filename="tmp_list_filenames" 
line_index=0 
cat $filename | while read processed_data_filename; do 
    line_index=$(($line_index + 1)) 
    var="haha$line_index" 
done 
echo "thevar:$var" 

的輸出是簡單地thevar:,或$var不raechable外while循環。爲什麼在這裏?我也試圖與while [ $line_index -lt 3 ]; do取代,而代碼行,如下所示,

#!/bin/bash 
filename="tmp_list_filenames" 
line_index=0 
while [ $line_index -lt 3 ]; do 
    line_index=$(($line_index + 1)) 
    var="haha$line_index" 
done 
echo "thevar:$var" 

然後,它打印thevar:haha4。對我來說很奇怪,有誰能解釋這一點嗎?

回答

6

UUOC的典型例子。通過將while循環放入管道中,它將在子進程中運行。有沒有必要管:因爲它被設置這是一個管道組件的命令內

while ...; do ...; done < $filename 

應該解決的問題

+0

+1,完全正確。我錯過了不需要管道的事實(然後繼續前進,也完全錯過了我的「解決方案」中的管道)。 – 2012-03-14 20:10:05

0

變量不可達。管道組件在其自己的子進程中執行,因此即使所討論的變量是全局的,變量綁定和賦值等進程狀態的變化也僅限於該進程。

如果你可以讓它以一個(仔細轉義的)變量賦值的形式打印它們的值,那麼shell可以從eval那裏獲取值。 (在一個情況下,你不能只是重組計劃,以擺脫子=過程。)

例子:

eval $(command 1 | FOO=abc ; echo FOO=\"$FOO\") 
#           ^^ note: not "carefully escaped" 

孩子打印FOO="abc"的母會eval,從而建立FOO的副本。

相關問題