Как использовать Bash для создания папки, если она еще не существует?


180
#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

Это не похоже на работу. Кто-нибудь может помочь?


4
Почему у вас точка с запятой?
ADTC

1
;Маркер представляет собой разделитель команд, так это перенос строки. Как thenотдельная команда, предыдущая точка с запятой необходима, чтобы иметь возможность записать ее в той же строке. Точки с запятой после mkdirи fiявляются лишними.
Андреас Ридмюллер

Ответы:


279

Во-первых, в bash «[» - это просто команда, которая ожидает строку «]» в качестве последнего аргумента, поэтому пробел перед закрывающей скобкой (а также между «!» И «-d», которые должны быть двумя отдельными аргументами тоже) важно

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

Во-вторых, поскольку вы используете ключ -p mkdir, эта проверка бесполезна, потому что именно это и происходит в первую очередь. Просто пиши:

mkdir -p /home/mlzboy/b2c2/shared/db;

и это все.


2
Примечание: -pфлаг заставляет любые родительские каталоги быть созданными при необходимости.
Даниэль

13
Боже мой, я никогда не знал, что «[» - это команда. Это объясняет многие из моих проблем ... Самая полезная вещь, которую я когда-либо читал в StackOverflow.
Бен Кушиган

1
Вот Это Да! Знание того, что «[» - это команда в bash, является таким откровением. Я чувствую, что многие проблемы с моими bash-скриптами теперь решены!
raluru

93

На самом деле нет необходимости проверять, существует ли он или нет. Так как вы уже хотите создать его, если он существует, просто mkdir сделает

mkdir -p /home/mlzboy/b2c2/shared/db

2
Примечание: -pфлаг заставляет любые родительские каталоги быть созданными при необходимости.
Даниэль

67

Просто сделайте:

mkdir /path/to/your/potentially/existing/folder

mkdir выдаст ошибку, если папка уже существует. Чтобы игнорировать ошибки, напишите:

mkdir -p /path/to/your/potentially/existing/folder

Нет необходимости делать какие-либо проверки или что-то подобное.


Для справки:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html


3
Аргумент -pне совсем игнорирует ошибки: он вызывает другой режим, в котором создаются любые несуществующие компоненты пути (и, следовательно, это не ошибка, если случается, что нужно создать ноль). Поведение отличается, так как это создаст компоненты, отличные от последнего, что может быть или не желательно.
BeeOnRope

23

Вам нужны пробелы внутри [и ]скобки:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

18

Более понятный способ - использовать ускоренную оценку логических операторов оболочки. Правая сторона оператора выполняется только в том случае, если левая сторона истинна.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

11
ммх, не чище: просто короче. Трудно понять смысл такого заявления, если вы сталкиваетесь с ним.
Давиде Орацио Монтерсино

1
Мне это нравится, хотя -pаргумент делает проверку ненужной. Вы все еще можете использовать его, когда вы не хотите его использовать -p, то есть когда вы не хотите, чтобы все родительские каталоги создавались автоматически.
ADTC

3
На самом деле это еще короче, чтобы написать [ -d /path/to/dir ] || mkdir /path/to/dir.. правая сторона выполняется, когда левая сторона ложна.
ADTC

4

Я думаю, вам следует немного переформатировать код:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.