;Znacznik jest separator polecenia tak jest nowej linii. Ponieważ thenjest to osobne polecenie, poprzedzający średnik jest potrzebny, aby móc zapisać go w tym samym wierszu. Średniki po mkdiri fisą zbędne.
Andreas Riedmüller
Odpowiedzi:
279
Po pierwsze, w bash "[" jest tylko poleceniem, które oczekuje napisu "]" jako ostatniego argumentu, więc spacja przed nawiasem zamykającym (jak również pomiędzy "!" I "-d", które muszą być dwoma oddzielnymi argumentami też) jest ważne:
Uwaga: -pflaga powoduje, że w razie potrzeby tworzone są katalogi nadrzędne.
Danijel
13
Mój Boże, nigdy nie wiedziałem, że „[” jest rozkazem. To wyjaśnia tak wiele moich problemów ... Z pewnością najbardziej użyteczna rzecz, jaką kiedykolwiek czytałem w StackOverflow.
Ben Kushigian
1
Łał! Świadomość, że "[" jest komendą w bash, otwiera oczy. Czuję, że wiele problemów z moimi skryptami bash zostało rozwiązanych!
raluru
93
W rzeczywistości nie ma potrzeby sprawdzania, czy istnieje, czy nie. Ponieważ już chcesz go utworzyć, jeśli istnieje, wystarczy mkdir
Argument -pnie ignoruje dokładnie błędów: wywołuje inny tryb, w którym tworzone są dowolne składniki ścieżki, które nie istnieją (a zatem nie jest błędem, jeśli zdarzy się, że trzeba utworzyć zero). Zachowanie jest inne, ponieważ utworzy komponenty inne niż ostatni, co może być pożądane lub nie.
BeeOnRope
23
Potrzebujesz spacji w nawiasach [i ]:
#!/bin/bashif[!-d /home/mlzboy/b2c2/shared/db ]then
mkdir -p /home/mlzboy/b2c2/shared/db
fi
Czystszy sposób, wykorzystanie skrótów do oceny operatorów logicznych powłoki. Prawa strona operatora jest wykonywana tylko wtedy, gdy lewa strona jest prawdą.
mmh, nie czyściej: tylko krócej. Trudno zrozumieć znaczenie takiego stwierdzenia, jeśli się z nim spotkasz.
Davide Orazio Montersino,
1
Podoba mi się to, chociaż -pargument sprawia, że sprawdzanie jest niepotrzebne. Nadal możesz go używać, gdy nie chcesz go używać -p, to znaczy, gdy nie chcesz, aby wszystkie katalogi nadrzędne były tworzone automatycznie.
ADTC
3
Właściwie pisanie jest jeszcze krótsze [ -d /path/to/dir ] || mkdir /path/to/dir... prawa strona jest wykonywana, gdy lewa strona jest fałszywa.
ADTC
4
Myślę, że powinieneś nieco ponownie sformatować swój kod:
;
Znacznik jest separator polecenia tak jest nowej linii. Ponieważthen
jest to osobne polecenie, poprzedzający średnik jest potrzebny, aby móc zapisać go w tym samym wierszu. Średniki pomkdir
ifi
są zbędne.Odpowiedzi:
Po pierwsze, w bash "[" jest tylko poleceniem, które oczekuje napisu "]" jako ostatniego argumentu, więc spacja przed nawiasem zamykającym (jak również pomiędzy "!" I "-d", które muszą być dwoma oddzielnymi argumentami też) jest ważne:
Po drugie, ponieważ używasz przełącznika -p do
mkdir
, to sprawdzenie jest bezużyteczne, ponieważ właśnie to robi w pierwszej kolejności. Tylko napisz:i to wszystko.
źródło
-p
flaga powoduje, że w razie potrzeby tworzone są katalogi nadrzędne.W rzeczywistości nie ma potrzeby sprawdzania, czy istnieje, czy nie. Ponieważ już chcesz go utworzyć, jeśli istnieje, wystarczy mkdir
źródło
-p
flaga powoduje, że w razie potrzeby tworzone są katalogi nadrzędne.Po prostu zrób:
mkdir zgłosi błąd, jeśli folder już istnieje. Aby zignorować błędy napisz:
Nie ma potrzeby sprawdzania ani niczego w tym rodzaju.
Na przykład:
-p, --parents no error if existing, make parent directories as needed
http://man7.org/linux/man-pages/man1/mkdir.1.htmlźródło
-p
nie ignoruje dokładnie błędów: wywołuje inny tryb, w którym tworzone są dowolne składniki ścieżki, które nie istnieją (a zatem nie jest błędem, jeśli zdarzy się, że trzeba utworzyć zero). Zachowanie jest inne, ponieważ utworzy komponenty inne niż ostatni, co może być pożądane lub nie.Potrzebujesz spacji w nawiasach
[
i]
:źródło
Czystszy sposób, wykorzystanie skrótów do oceny operatorów logicznych powłoki. Prawa strona operatora jest wykonywana tylko wtedy, gdy lewa strona jest prawdą.
źródło
-p
argument sprawia, że sprawdzanie jest niepotrzebne. Nadal możesz go używać, gdy nie chcesz go używać-p
, to znaczy, gdy nie chcesz, aby wszystkie katalogi nadrzędne były tworzone automatycznie.[ -d /path/to/dir ] || mkdir /path/to/dir
... prawa strona jest wykonywana, gdy lewa strona jest fałszywa.Myślę, że powinieneś nieco ponownie sformatować swój kod:
źródło