Unix shell脚本:将文件到变量的值分配到while循环,并在循环外使用此值

时间:2010-11-29 13:53:36

标签: linux shell unix while-loop

我正在编写一个shell脚本,我必须在其中提取类型为的文件的内容:

  

TYPE1 |值a
  类型2 | VALUEB
  TYPE1 | valueC
  类型2 |价值
  类型3 | valueE
  ....
  力typen | valueZ。

对于column_1中的每个类型,我有一个目标变量,它连接相同类型的值,得到如下结果:

  

VAR1 =值a,valueC
  VAR2 = VALUEB,价值
  VAR3 = valueE
  .....

脚本实现了这样的东西:

var1="HELLO"  
var2="WORLD"  
...  
cat $file | while read record; do  
   #estract column_1 and column_2 from $record    
if [ $column_1 = "tipo1" ]; then  
   var1="$var1, column_2"  ## column_2 = valueB
elif ....  
....  
fi  
done

但是当我尝试使用链接column_2的任何变量的值时:

    echo "$var1 - $var2"   

我得到原始值:

    HELLO - WORLD.    

在互联网上搜索,我发现问题与管道创建子shell的事实有关,其中实际值被复制。

有没有办法解决这个问题!?

最重要的是,有一种适合所有类型shell的方法,事实上,这个脚本必须可能在不同的shell上运行! 我不想使用文件支持来编写部分结果。

4 个答案:

答案 0 :(得分:3)

您无需使用cat。将某些内容放入while会创建一个子shell。当子shell退出时,循环中设置的变量值将丢失(因为使用cd作为目录更改的另一个例子。相反,您应该将文件重定向到done

while condition
do
    # do some stuff
done < inputfile

顺便说一句,而不是:

while read record

你可以这样做:

while IFS='|' read -r column1 column2

答案 1 :(得分:2)

答案 2 :(得分:0)

Oneliner:

for a in `awk "-F|" '{print $1;}' test | sort -u` ; do echo -n "$a =" ; grep -e "^$a" test | awk "-F|" '{ printf(" %s,", $2);}' ; echo "" ; done

答案 3 :(得分:0)

使用awk

awk '{a[$1]=a[$1]==""?$2:a[$1] OFS $2}
END{for (i in a) print i"="a[i]}' FS=\| OFS=, file  

type1=valueA,valueC
type2=valueB,valueD
type3=valueE