Bashスクリプト分割エラー

Bashスクリプト分割エラー

私はディレクトリを読み込み、その中にあるすべてのファイル(すべてのサブディレクトリを含む)のファイル形式を返す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

関連情報