使用 $# 和循环处理脚本时遇到问题

使用 $# 和循环处理脚本时遇到问题

我有以下脚本:

    #!/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 它不是目录”,将 $i 读取为 1 而不是 $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

另请注意变量周围双引号的重要性

也就是说......您可以大大简化您的脚本。例如,这是一行这几乎可以完成您尝试对脚本执行的所有操作。

相关内容