无法从AWK语句填充Bash数组

时间:2012-09-17 04:08:21

标签: arrays bash shell

我需要从配置文件中获取一个或多个位置,然后检查每个位置以查找某些文件。我有一个AWK和SED组合,它找到位置,然后从文本文件中读取文件列表。我想检查文件的每个位置,并考虑使用bash数组来保存位置。

但由于某些原因,我无法从AWK语句中填充数组。在我看来,它将完整的内容加载到第一个元素中。

如果我手动填充数组它可以工作;例如替换行数组= $(awk ... 与

array[1]=/docs01/objdata/admin/p1dig
array[2]=/docs02/objdata/admin/p1dig
array[3]=/docs03/objdata/admin/p1dig
array[4]=/docs04/objdata/admin/p1dig

在下面的代码片段中,我删除了外部(文件名)循环并添加了一些调试上下文。

#!/bin/bash

declare -a array

OBJECTIVE_CONF=/u01/app/objective/perf/DOS1/config/objConf.xml
FILE=/tmp/DoS1_files.dsv

# IFS=$"/n"
array=$(awk '/<volume>/,/<\/volume>/' $OBJECTIVE_CONF | grep "<path>" | sed "s#<[/]*path>##g" | sed 's/^[ \t]*//' |sed 's/[ \t]*$//' )

element_count=${#array[@]}
echo "element_count is : $element_count "


echo "index is: $index"
echo "${array[$index]}"

   echo "filename loop"

   index=0
   while [ "$index" -lt "$element_count" ]
   do
      let "index = $index + 1"
      echo "index is: $index"
      echo "ls ${array[$index]}/filename_from_loop"
   done
   echo "leaving loop"

从命令行运行时,Awk语句为我提供了预期的结果。我用AWK开始和结束XML标签,grep里面有PATH,并使用SED删除PATH exm标签和前导和训练空间。

bash-3.00$ awk '/<volume>/,/<\/volume>/' $OBJECTIVE_CONF | grep "<path>" | sed "s#<[/]*path>##g" | sed 's/^[ \t]*//' |sed 's/[ \t]*$//'
/docs01/objdata/admin/p1dig
/docs02/objdata/admin/p1dig
/docs03/objdata/admin/p1dig
/docs04/objdata/admin/p1dig

2 个答案:

答案 0 :(得分:3)

$(<command>)替换不会产生数组。要获取数组,请使用另一对括号:

array=($(<command>))

答案 1 :(得分:1)

您也可以使用readarray语句:

readarray array < <(command)

差异而不仅仅是array=($(<command>)),就是你对最终数组有更多的控制权,(man)

< <(command)用于没有子进程的函数/命令扩展。