Muszę utworzyć skrypt powłoki, który sprawdza obecność pliku, a jeśli nie istnieje, tworzy go i przechodzi do następnego polecenia lub po prostu przechodzi do następnego polecenia. To, co mam, tego nie robi.
#!/bin/bash
# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi
# Next command (macOS preference setting)
defaults write ...
Return is
line 5: [!: command not found
mkdir: /Scripts: File exists
Nie mam pojęcia, co robić. Każde miejsce, które przynosi mi wyszukiwarka Google, wskazuje coś innego.
bash
shell-script
osx
jrw
źródło
źródło
touch
pliku i pominąć warunkowe?[
i!
), ale prawdopodobnie warto tutaj wskazać, że[
jest to rzeczywiste polecenie w systemie Unix. Polecenie uniksowe wymaga spacji między nazwą polecenia a jego argumentami. Tak, jest to także wbudowany Bash , ale w/usr/bin/[
większości systemów jest też plik binarny .Odpowiedzi:
Ewentualnie prostsze rozwiązanie, nie trzeba wykonywać jawnych testów, wystarczy użyć:
Jeśli nie chcesz, aby czas „modyfikacji” istniejącego
file.txt
był zmienianytouch
, możesz użyć,touch -a /Scripts/file.txt
abytouch
zmienić tylko czasy „dostępu” i „zmiany”.źródło
>>/Scripts/file.txt
. Spowoduje to otwarcie pliku do dołączenia i utworzenie go, jeśli nie istnieje.Otrzymujesz błąd, ponieważ nie ma miejsca pomiędzy
[
a!
jednak istnieją też pewne błędy w kodzie. Najpierw sprawdzasz, czy plik nie istnieje, a jeśli nie, nic nie robisz. Jeśli plik NIE istnieje, tworzysz katalog (ale nic nie robisz, aby utworzyć plik).Nie potrzebujesz również operacji zerowej, powinieneś być w stanie po prostu zrobić:
Sprawdza, czy
/Scripts/file.txt
nie istnieje, utworzy/Scripts
katalog, a następniefile.txt
plik. Możesz również sprawdzić istnienie katalogu osobno, jeśli chcesz. Dodatkowo zauważ, że używam-e
zamiast tego, o-f
co prosiłeś, aby po prostu sprawdzić, czy istnieje plik, co-e
zrobi tam, gdzie-f
sprawdzi, czy jest to „zwykły plik” http://tldp.org/LDP/abs/html/fto. HTMLźródło
Na początek skrypt powłoki nie jest skryptem bashowym , więc zróbmy bardziej ogólny kod:
Każdy system Posix musi mieć ten plik; bash jest całkowicie opcjonalny.
Nie ma potrzeby sprawdzania, czy katalog istnieje, po prostu
Aby utworzyć plik, jeśli nie istnieje,
Lub jeśli wolisz
źródło
Wystąpił błąd składniowy. Potrzebujesz spacji przed i po
[
oraz]
.źródło
Powyższe zakłada, że nie ma „sztuczek”, takich jak utworzenie katalogu o nazwie
/Scripts/file.txt
(co może być sposobem na zmuszenie skryptu, aby zawsze wchodził do gałęzi if). Jeśli „plik” jest katalogiem, test -f zakończy się niepowodzeniem, a polecenie dotykowe niczego nie zmieni.źródło
moje podejście
wynik
.
źródło
touch
imkdir -p