如何在unix脚本中为变量赋值

时间:2013-11-27 18:50:11

标签: arrays shell unix

  

例如:

      $cat macro  
        File abc.txt  
        File xyz.csv  
        File bdc.txt  
        File lkm.csv  
        File cde.txt  
  

执行grep只获取* .txt文件名

 $grep -oh "\w*xml\w*" macro  
   abc.txt  
   bdc.txt  
   cde.txt
  

现在我需要将这些grep结果输出到一个数组,下面给出的代码不能正常工作。我能够将grep结果存储在单个变量中,而不是存储在单独的变量中,即数组

  $cat txt.sh  
       var=$(grep -oh "\w*xml\w*" macro)  
        echo ${var[0]} #echo var ---both displays same result.
  

输出

abc.txt bdc.txt cde.txt  
  

但是我希望它们在数组中,并将值指定为以下

  >var[0]=abc.txt  
  >var[1]=bdc.txt  
  >var[2]=cde.txt

注意:xml文件的数量可能会有所不同。所以它应该是动态的。我也在努力..   提前谢谢。

2 个答案:

答案 0 :(得分:0)

你的var变量不是array.Consider它只是一个变量,其中grep的结果用空格分隔。这可能是一种解决方法。

for eachval in var
do
echo $eachval
#process operations 
done

循环的每次迭代都会从变量中提供一个项目。如果您确定需要一个数组变量,请在循环中初始化它

答案 1 :(得分:0)

在shell脚本的开头,只需将IFS shell变量设置为\ n,以便按'\ n'分隔字段

IFS=$'\n'
$cat txt.sh  
var=$(grep -oh "\w*xml\w*" macro)  
echo ${var[0]} #echo var ---both displays same result.

解释::$ IFS是bash的输入字段分隔符,仅将其设置为换行符(\ n)确保您的输出行不会在空格上分割,以便您可以保存每个line作为单独的数组元素。如果没有这个,命令输出的每个单词都将是一个不同的元素。

根据你想要做的事情,保存$ IFS的旧值并在读取数组后恢复它可能是个好主意:

oldifs="$IFS"
IFS=$'\n'
array=($(echo -e "foo bar\nbaz bar"))
IFS="$oldifs"