我需要从配置文件中获取一个或多个位置,然后检查每个位置以查找某些文件。我有一个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
答案 0 :(得分:3)
$(<command>)
替换不会产生数组。要获取数组,请使用另一对括号:
array=($(<command>))
答案 1 :(得分:1)
您也可以使用readarray语句:
readarray array < <(command)
差异而不仅仅是array=($(<command>))
,就是你对最终数组有更多的控制权,(man)
< <(command)
用于没有子进程的函数/命令扩展。