Работа с оператором if

Я добавил код из ранее заданного вопроса :

Мой код:

DIR="$1" if [ -e "$DIR" ] then echo -n "total directories:" ; find $DIR -type d | wc -l echo -n "total files:" ; find $DIR -type f | wc -l else if [ -f "$DIR" ] then echo " Directory doesn't exist" else echo " please pass correct arguments" fi fi 

Этот код дает результат при выполнении ./countfiledirs или countfiledirs jhfsakl :

 sreekanth@sreekanth-VirtualBox:~$ ./countfiledirs please pass correct arguments sreekanth@sreekanth-VirtualBox:~$ ./countfiledirs ffff please pass correct arguments 

Я хочу вывод, когда я выполнил имя скрипта ./countfiledirs как:

 please pass correct arguments 

и для ./countfiledirs ffff as:

 directory doesn't exists 

У меня есть еще одна проблема с кодом, когда я выполнял скрипт ./countfiledirs /usr/share . Это не дает фактически никаких каталогов и подкаталогов для пути, который я дал. Вместо 3-х каталогов он показывает 4

  • если всегда false с равными переменными
  • Как проверить создание двух новых файлов в bash и выполнить действие?
  • rm все файлы справа от "==", напечатанные на экране
  • Сценарий оболочки для отображения первой или последней n строк файла
  • удаление пробелов и номеров
  • tr -d не работает с возвратом каретки
  • Что делает файл filename.txt в сценарии оболочки
  • Ошибка подстроки в сценарии оболочки
  • 2 Solutions collect form web for “Работа с оператором if”

    Тест [ -f "$DIR" ] является истинным, если существует $DIR и является файлом . Это совсем не то, чего вы хотите. Как я уже говорил в предыдущем вопросе, вы должны использовать $# чтобы проверить, прошел ли аргумент. Затем вы можете использовать -e чтобы проверить, существует ли этот аргумент.

    Следующая проблема заключается в том, что find также будет отображаться . , текущий каталог. Вы можете использовать -mindepth 1 чтобы избежать этого с GNU find :

     DIR="$1" if [ $# -lt 1 ] then echo "Please pass at least one argument" && exit fi if [ -e "$DIR" ] then echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l echo -n "total files:" ; find $DIR -type f | wc -l else echo "Directory doesn't exist" fi 

    Вы также можете сконденсировать вышеуказанное (хотя эта версия не различает директорию, которая не существует, и та, которая является файлом, а не каталогом):

     dir="$1" [ $# -lt 1 ] && echo "Please pass at least one argument" && exit [ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \ $(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) || printf "%s\n" "There is no directory named '$dir'." 

    Поскольку у вас это в последнем условии, вы проверяете, ссылается ли $ DIR на «обычный файл». То есть не каталог. Таким образом, он всегда терпит неудачу (поскольку вы всегда даете каталоги, предположительно) и печатаете «пожалуйста, передайте правильные аргументы».

    Что касается того, что подсчет каталогов является «неправильным», это не так. Если бы вы вручную запускали команду find, как в скрипте, вы увидите, что она возвращает каталог в корень своего поиска, а также его подкаталоги. Таким образом, вы можете либо знать, что он считает данный каталог, либо получить желаемый ответ, просто уменьшив счет после вызова find.

    Кажется, это то, что вы ищете. Потерпите меня; Я проверял, что это работает, но я не эксперт BASH.

     DIR="$1" if [ ! -d "$DIR" ] #If not a directory, then echo " please pass correct arguments" exit 1 fi # We know for sure $DIR is present and a directory, so we know # that it will show up in the find results for type d. Decrement. echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1)) echo echo -n "total files:" ; find $DIR -type f | wc -l 
    Linux и Unix - лучшая ОС в мире.