Shell Script - Создать каталог, если он не существует

Я хочу ввести имя каталога и проверить, существует ли он. Если он не существует, я хочу создать, но я получаю ошибку mkdir: cannot create directory'./' File exists

Мой код говорит, что файл существует, хотя это не так. Что я делаю неправильно?

echo "Enter directory name"
read dirname

if [[ ! -d "$dirname" ]]
then
    if [ -L $dirname]
then
    echo "File doesn't exist. Creating now"
    mkdir ./$dirname
    echo "File created"
    else
        echo "File exists"
    fi
fi

4 ответа

Решение
if [ -L $dirname]

Посмотрите на сообщение об ошибке, выдаваемое этой строкой: "[: missing `]'"или что-то подобное (в зависимости от того, какую оболочку вы используете). Вам нужно место в скобках. Вам также нужны двойные кавычки вокруг расширения переменной, если вы не используете двойные скобки; вы можете либо изучить правила, либо использовать простое правило: всегда используйте двойные кавычки вокруг подстановки переменных и подстановки команд - "$foo", "$(foo)",

if [ -L "$dirname" ]

Тогда возникает логическая ошибка: вы создаете каталог, только если есть символическая ссылка, которая не указывает на каталог. Вы, вероятно, хотели иметь там отрицание.

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

Правильный способ создать каталог, если он не существует,

mkdir -p -- "$dirname"

(Двойные кавычки в случае $dirname содержит пробелы или символы-заглушки, -- в случае, если это начинается с -.)

Попробуйте этот код:

echo "Enter directory name"
read dirname

if [ ! -d "$dirname" ]
then
    echo "File doesn't exist. Creating now"
    mkdir ./$dirname
    echo "File created"
else
    echo "File exists"
fi

Выходной журнал:

Chitta:~/cpp/shell$ ls
dir.sh

Chitta:~/cpp/shell$ sh dir.sh
Enter directory name
New1
File doesn't exist. Creating now
File created

chitta:~/cpp/shell$ ls
New1  dir.sh

Chitta:~/cpp/shell$ sh dir.sh
Enter directory name
New1
File exists

Chitta:~/cpp/shell$ sh dir.sh
Enter directory name
New2
File doesn't exist. Creating now
File created

Chitta:~/cpp/shell$ ls
New1  New2  dir.sh

Попробуй это: ls yourdir 2>/dev/null||mkdir yourdir, который является крошечным и лаконичным и выполняет вашу задачу.

read -p "Enter Directory Name: " dirname
if [[ ! -d "$dirname" ]]
then
        if [[ ! -L $dirname ]]
        then
                echo "Directory doesn't exist. Creating now"
                mkdir $dirname
                echo "Directory created"
        else
                echo "Directory exists"
        fi
fi
Другие вопросы по тегам