;Маркер представляет собой разделитель команд, так это перенос строки. Как thenотдельная команда, предыдущая точка с запятой необходима, чтобы иметь возможность записать ее в той же строке. Точки с запятой после mkdirи fiявляются лишними.
Андреас Ридмюллер
Ответы:
279
Во-первых, в bash «[» - это просто команда, которая ожидает строку «]» в качестве последнего аргумента, поэтому пробел перед закрывающей скобкой (а также между «!» И «-d», которые должны быть двумя отдельными аргументами тоже) важно
Примечание: -pфлаг заставляет любые родительские каталоги быть созданными при необходимости.
Даниэль
13
Боже мой, я никогда не знал, что «[» - это команда. Это объясняет многие из моих проблем ... Самая полезная вещь, которую я когда-либо читал в StackOverflow.
Бен Кушиган
1
Вот Это Да! Знание того, что «[» - это команда в bash, является таким откровением. Я чувствую, что многие проблемы с моими bash-скриптами теперь решены!
raluru
93
На самом деле нет необходимости проверять, существует ли он или нет. Так как вы уже хотите создать его, если он существует, просто mkdir сделает
Аргумент -pне совсем игнорирует ошибки: он вызывает другой режим, в котором создаются любые несуществующие компоненты пути (и, следовательно, это не ошибка, если случается, что нужно создать ноль). Поведение отличается, так как это создаст компоненты, отличные от последнего, что может быть или не желательно.
BeeOnRope
23
Вам нужны пробелы внутри [и ]скобки:
#!/bin/bashif[!-d /home/mlzboy/b2c2/shared/db ]then
mkdir -p /home/mlzboy/b2c2/shared/db
fi
Более понятный способ - использовать ускоренную оценку логических операторов оболочки. Правая сторона оператора выполняется только в том случае, если левая сторона истинна.
ммх, не чище: просто короче. Трудно понять смысл такого заявления, если вы сталкиваетесь с ним.
Давиде Орацио Монтерсино
1
Мне это нравится, хотя -pаргумент делает проверку ненужной. Вы все еще можете использовать его, когда вы не хотите его использовать -p, то есть когда вы не хотите, чтобы все родительские каталоги создавались автоматически.
ADTC
3
На самом деле это еще короче, чтобы написать [ -d /path/to/dir ] || mkdir /path/to/dir.. правая сторона выполняется, когда левая сторона ложна.
ADTC
4
Я думаю, вам следует немного переформатировать код:
;
Маркер представляет собой разделитель команд, так это перенос строки. Какthen
отдельная команда, предыдущая точка с запятой необходима, чтобы иметь возможность записать ее в той же строке. Точки с запятой послеmkdir
иfi
являются лишними.Ответы:
Во-первых, в bash «[» - это просто команда, которая ожидает строку «]» в качестве последнего аргумента, поэтому пробел перед закрывающей скобкой (а также между «!» И «-d», которые должны быть двумя отдельными аргументами тоже) важно
Во-вторых, поскольку вы используете ключ -p
mkdir
, эта проверка бесполезна, потому что именно это и происходит в первую очередь. Просто пиши:и это все.
источник
-p
флаг заставляет любые родительские каталоги быть созданными при необходимости.На самом деле нет необходимости проверять, существует ли он или нет. Так как вы уже хотите создать его, если он существует, просто mkdir сделает
источник
-p
флаг заставляет любые родительские каталоги быть созданными при необходимости.Просто сделайте:
mkdir выдаст ошибку, если папка уже существует. Чтобы игнорировать ошибки, напишите:
Нет необходимости делать какие-либо проверки или что-то подобное.
Для справки:
-p, --parents no error if existing, make parent directories as needed
http://man7.org/linux/man-pages/man1/mkdir.1.htmlисточник
-p
не совсем игнорирует ошибки: он вызывает другой режим, в котором создаются любые несуществующие компоненты пути (и, следовательно, это не ошибка, если случается, что нужно создать ноль). Поведение отличается, так как это создаст компоненты, отличные от последнего, что может быть или не желательно.Вам нужны пробелы внутри
[
и]
скобки:источник
Более понятный способ - использовать ускоренную оценку логических операторов оболочки. Правая сторона оператора выполняется только в том случае, если левая сторона истинна.
источник
-p
аргумент делает проверку ненужной. Вы все еще можете использовать его, когда вы не хотите его использовать-p
, то есть когда вы не хотите, чтобы все родительские каталоги создавались автоматически.[ -d /path/to/dir ] || mkdir /path/to/dir
.. правая сторона выполняется, когда левая сторона ложна.Я думаю, вам следует немного переформатировать код:
источник