$#とループを使用してスクリプトを処理するのに問題があります。

$#とループを使用してスクリプトを処理するのに問題があります。

次のスクリプトがあります。

    #!/bin/bash
    for ((i=1; i<=$#; i++));
    do
       if [ ! -d $i ]
       then
          echo $i its not a directory >> file.txt
       else
          DIRECTORY=$(ls -l $i | grep ^d | wc -l)
          LINK=$(find $i -type l | wc -l)
          FILE=$(ls -A $i | wc -l)

          echo `date "+%H:%M:%S %d-%m-%y"` directory $i file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt

       fi
    done

スクリプトは、引数として入力されたディレクトリのサブディレクトリ、リンク、およびファイルの数を計算します(1を超えることがあります)。

「echo $i ディレクトリではありません」を返し、$1 ではなく $i を 1 として読み取るループが原因で問題が発生しています。なぜこれを行うのか理解していますが、スクリプトから始めて修正方法がわかりません。これ。 「while」が「for」を置き換えることができると思いますが、正しく使用する方法がわかりません。

助けてくれてありがとう!

答え1

1から[引数の数]まで繰り返し、各番号が実際にディレクトリであるかどうかをテストします。以下を行う方が簡単です。

#!/bin/bash
for item in "$@"; do  # iterate over the arguments themselves
    if [[ ! -d "$item" ]]; then
        echo "$item is not a directory" >> file.txt
    else
        DIRECTORY=$(ls -l $item | grep ^d | wc -l)
        LINK=$(find $item -type l | wc -l)
        FILE=$(ls -A $item | wc -l)

        echo `date "+%H:%M:%S %d-%m-%y"` directory $item file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt
    fi
done

答え2

あなたが望むのは変数間接参照です - あなたはその変数を参照したいです名前別の変数に保存されます。可能です。代わりにbash引用してください。"${!i}"$i

また参考にしてください変数の周りの二重引用符の重要性

つまり、スクリプトを大幅に簡素化できます。例えば、これはラインですこれはスクリプトで実行したいほとんどすべてのことを行います。

関連情報