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