1

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

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

如果我手动填充数组,它可以工作;例如,将行 array=$(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 标记,在 PATH 中使用 grep 并使用 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
4

2 回答 2

3

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

array=($(<command>))
于 2012-09-17T04:35:29.727 回答
1

您也可以使用 readarray 语句:

readarray array < <(command)

与分配不同的array=($(<command>))是,您对最终数组有更多的控制权,(man)

< <(command)是用于没有子进程的功能/命令扩展。

于 2012-09-17T08:00:12.677 回答