異なる拡張子のファイルのアクションを実行するスクリプトを作成しようとしています。可能な限り異なるアクションを追加するために、配列から配列を読み込み、ファイルを「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"
に追加する方法を考え出しました。 – choroba