2016-05-24 6 views
0

異なる拡張子のファイルのアクションを実行するスクリプトを作成しようとしています。可能な限り異なるアクションを追加するために、配列から配列を読み込み、ファイルを「find」コマンドで見つけ出し、検索されたファイル拡張子の名前に基づいて動的に生成された配列に結果を返します。bashの動的に生成されたループをループで処理する

新しい拡張機能を追加するには、単にfile_ext配列に追加するだけです。

私はこのような配列を作成:

file_exts=("dsd" "dsdd" "dmesg") 

for ext in "${file_exts[@]}" 
do 

     echo "Finding $ext files" 
     eval var="exts_$ext" 

     declare -a $var="($(find "$dirs_target" -name "*.$ext"))" 

done 

アレイが正しく作成され、私は手動で "{[1] exts_dsd} $ {exts_dsd [0]} $" をエコーエントリを見ることができ、しかし、私は動的に割り当てられた配列の各エントリをループする方法を見つけることができません。

私はevalのを使用して、いくつかの組み合わせを試してみました、と私はここで私はすでに試した二つあり、IEは単に「$のexts_dsd」を参照して、配列の最初のエントリをプリントアウトすることができます。

for varname in "${[email protected]}" 
do 

     for entry in ${varname[@]} 
     do 
       echo "$varname : $entry" 
     done 

     eval value=\$${varname[@]}  

     echo "$varname=$value" 
done 

方法は、上記forループの各エントリをループすることができますので、動的に作成されたすべての配列のすべてのエントリを出力できますか?ただ変数に変数名を格納します。エントリをループする

#! /bin/bash 


file_exts=("dsd" "dsdd" "dmesg") 
dirs_target="/tmp/arraytest/" 

echo "Creating $dirs_target" 
if [[ ! -d "$dirs_target" ]]; then 

     if ! mkdir "$dirs_target"; then 
       echo "Couldn't create temp dir" 
       exit 1 
     fi 
fi 

echo "Creating test files" 
for tmpfile in $(seq 0 5) 
do 
     echo -e "\tCreating $dirs_target$tmpfile.dsd" 
     if ! touch "$dirs_target/$tmpfile.dsd"; then 
       echo "Coudn't create $dirs_target/test$tmpfile.dsd" 
       exit 1 
     fi 
done 

echo "" 
echo "-----Finding Files-----" 
for ext in "${file_exts[@]}" 
do 

     echo "Finding $ext files" 
     eval var="exts_$ext" 

     declare -a $var="($(find "$dirs_target" -name "*.$ext"))" 

done 
echo "" 
echo "-----File Extensions-----" 
for varname in "${[email protected]}" 
do 

     for entry in ${varname[@]} 
     do 
       echo "$varname : $entry" 
     done 
     eval value=\$${varname[@]} 
     #echo "$varname=$value" 
done 

echo "" 
echo "Finishing." 
rm -rf "$dirs_target" 

答えて

2

は、あなたがそれらを作成するときと同じトリックを使用する必要があります。ここでは

は、完全なテストスクリプトです。私は答えを見つけた。また eval

# eval var="exts_$ext" 
var=exts_$ext # works even better! 
0

で必要とされないことに注意してください

for varname in "${[email protected]}" ; do 
    arr=$varname'[@]' 
    for entry in "${!arr}" ; do 
     echo "$varname : $entry" 
    done 
done 

:ポイントは正しく間接に認識されますあまりにも[@]インデックスを、含めることです。私はevalのステートメントを少し間違っていた。ボーナスとして

echo "-----File Extensions-----" 
for varname in "${[email protected]}" 
do 

     echo "varname=$varname" 

     eval testvalue="\${$varname[@]}" 

     for entry in $testvalue 
     do 
       echo -e "\tFile: $entry" 
     done 

done 

、私はまた、あなたは何の `eval`を必要としない、動的に作成された配列

var="table_$entry" 
declare -a $var 

while read -r line 
do 
     eval $var+=\(\'"$line"\'\) 

done < "$dirs_table" 
+0

に追加する方法を考え出しました。 – choroba

関連する問題