проблемы при работе со сценарием с $ # и циклом

у меня есть следующий сценарий:

    #!/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», но не знаю, как его правильно использовать.

спасибо за помощь!

0
04.02.2019, 14:55
2 ответа

Вы выполняете цикл от 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
1
28.01.2020, 02:35

То, что вы пытаетесь сделать, называется перенаправлением переменной - вы хотите обратиться к переменной, чье имя хранится внутри другой переменной. Это возможно в bash- просто ссылайтесь на "${!i}" вместо $i.

Также обратите внимание на важность двойных кавычек вокруг ваших переменных.

Учитывая это... вы можете значительно упростить свой скрипт. Например, вот одна строка, которая делает почти все, что вы пытаетесь сделать с помощью вашего скрипта.

1
28.01.2020, 02:35

Теги

Похожие вопросы