O ;token é um separador de comandos, assim como a nova linha. Como thené um comando separado, o ponto-e-vírgula anterior é necessário para poder escrevê-lo na mesma linha. Os pontos mkdire vírgulas após e fisão supérfluos.
Andreas Riedmüller
Respostas:
278
Primeiro, no bash "[" é apenas um comando, que espera a string "]" como último argumento, portanto, o espaço em branco antes do colchete de fechamento (bem como entre "!" E "-d", que precisam ser dois argumentos separados também) é importante:
O argumento -pnão ignora exatamente os erros: ele invoca um modo diferente em que todos os componentes do caminho que não existem são criados (e, portanto, não é um erro se acontecer que zero precise ser criado). O comportamento é diferente, pois cria componentes diferentes do último, que podem ou não ser desejáveis.
BeeOnRope
23
Você precisa de espaços dentro dos colchetes [e ]:
#!/bin/bashif[!-d /home/mlzboy/b2c2/shared/db ]then
mkdir -p /home/mlzboy/b2c2/shared/db
fi
De maneira mais limpa, explore a avaliação de atalhos dos operadores lógicos do shell. O lado direito do operador é executado apenas se o lado esquerdo for verdadeiro.
mmh, não mais limpo: apenas mais curto. É difícil entender o significado dessa afirmação se você a encontrar.
Davide Orazio Montersino
1
Eu gosto disso, embora o -pargumento torne a verificação desnecessária. Você ainda pode usá-lo quando não quiser usá-lo -p, ou seja, quando não desejar que todos os diretórios pai sejam criados automaticamente.
ADTC 13/04
3
Na verdade, é ainda mais curto para escrever [ -d /path/to/dir ] || mkdir /path/to/dir. O lado direito é executado quando o lado esquerdo é falso.
ADTC
4
Eu acho que você deve reformatar um pouco o seu código:
;
token é um separador de comandos, assim como a nova linha. Comothen
é um comando separado, o ponto-e-vírgula anterior é necessário para poder escrevê-lo na mesma linha. Os pontosmkdir
e vírgulas após efi
são supérfluos.Respostas:
Primeiro, no bash "[" é apenas um comando, que espera a string "]" como último argumento, portanto, o espaço em branco antes do colchete de fechamento (bem como entre "!" E "-d", que precisam ser dois argumentos separados também) é importante:
Segundo, como você está usando a opção -p
mkdir
, essa verificação é inútil, porque é o que acontece em primeiro lugar. Apenas escreva:e é isso.
fonte
-p
sinalizador faz com que qualquer diretório pai seja criado, se necessário.Na verdade, não há necessidade de verificar se existe ou não. Como você já deseja criá-lo, se existir, apenas o mkdir fará
fonte
-p
sinalizador faz com que qualquer diretório pai seja criado, se necessário.Simplesmente faça:
O mkdir lançará um erro se a pasta já existir. Para ignorar os erros, escreva:
Não há necessidade de fazer nenhuma verificação ou algo assim.
Para referência:
-p, --parents no error if existing, make parent directories as needed
http://man7.org/linux/man-pages/man1/mkdir.1.htmlfonte
-p
não ignora exatamente os erros: ele invoca um modo diferente em que todos os componentes do caminho que não existem são criados (e, portanto, não é um erro se acontecer que zero precise ser criado). O comportamento é diferente, pois cria componentes diferentes do último, que podem ou não ser desejáveis.Você precisa de espaços dentro dos colchetes
[
e]
:fonte
De maneira mais limpa, explore a avaliação de atalhos dos operadores lógicos do shell. O lado direito do operador é executado apenas se o lado esquerdo for verdadeiro.
fonte
-p
argumento torne a verificação desnecessária. Você ainda pode usá-lo quando não quiser usá-lo-p
, ou seja, quando não desejar que todos os diretórios pai sejam criados automaticamente.[ -d /path/to/dir ] || mkdir /path/to/dir
. O lado direito é executado quando o lado esquerdo é falso.Eu acho que você deve reformatar um pouco o seu código:
fonte