私はディレクトリを読み込み、その中にあるすべてのファイル(すべてのサブディレクトリを含む)のファイル形式を返すbashスクリプトを書くことを任命しました。 find コマンドは許可されません。これを達成するために2つのforループを試しましたが、分割エラーが発生しました。しかし、サブディレクトリなしでディレクトリを渡すと、スクリプトが機能することがわかりました。愚かな奴のコードを見て、何が間違っているのか教えてくれる人がいますか?とても感謝しています。
#!/bin/bash
func () {
for name in $1
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$1"
fi
done
}
directory="$1/*"
for name in $directory
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$1"
fi
done
答え1
処理中の ""がディレクトリの場合は、元の引数ではなくその内容$name
で呼び出す必要があります。それ以外の場合は無限ループが発生し、セグメントが発生します。func
元のパラメータに関数を使用し、その関数を各項目に個別に適用すると、コードを大幅に削減できます。とにかく、今では身体機能で何が起こるのかを繰り返しています。
#!/bin/bash
func () {
local arg="$1"
if [[ -f "$arg" ]] ; then
file -- "$arg"
return
fi
if [[ -d "$arg" ]] ; then
for file in "$arg"/* ; do
func "$file"
done
fi
}
func "$1"
答え2
bash機能にアクセスできる場合、最も簡単な方法はその機能を有効にしてglobstar
使用することです。
shopt -s globstar
for f in "$1"/**; do
if [ -f "$f" ]; then
file -- "$f"
fi
done
元のスクリプトのロジックを使用すると、正しい入力を提供できます。
#!/bin/bash
func () {
for name in "$1"/*
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$name"
fi
done
}
directory="$1"
for name in "$directory"/*
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$name"
fi
done
func $1
代わりに使用中でfunc $name
無限ループに入ってセグフォルトが発生しました。次のいずれかを追加してecho
作業している内容を確認すると、すぐにエラーが表示されます。
また、実際にこのようなコードを繰り返す必要はありません。関数の全体的なポイントは、これらの冗長性を避けることですので、単に次のようにすることができます。
#!/bin/bash
func () {
for name in "$1"/*
do
echo "FF $name"
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$name"
fi
done
}
directory="$1"
for name in "$directory"/*
do
func "$name"
done