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 ステートメントをコマンド ラインから実行すると、期待どおりの結果が得られます。XML の開始タグと終了タグに対して AWK を実行し、その中で 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 に答える