2016-03-20 10 views
-1

Ich bin neu in Shell-Skripting und das ist meine Shell-Skript. Ich bin diesen Fehler und stecken darinFehler in der Nähe von unerwarteten Token 'dann' in Shell-Skript

defoul="http://distfiles.gentoo.org/snapshots" 
echo "cheking for latest snapshot">&2 
mkdir -p ~\cashe 
mkdir -p ~\cashe\temp 
cd ~\cashe\ 
if [ -e portage-latest.tar.xz.gpgsig ]; then 
    mv portage-latest.tar.xz.gpgsig ~\cashe\temp 
fi 
+3

Sie sollten zuerst Ihr \ mit/als Verzeichnistrennzeichen ersetzen. Wenn es sich um ein Bash-Skript handelt, sollte es normalerweise '#!/Bin/bash' als erste Zeile haben. –

+0

Unix-ähnliche Systeme verwenden das Backslash-Zeichen nicht zum Trennen von Verzeichnispfaden. Verwenden Sie stattdessen '/'. (Windows erlaubt beides; Unix nicht.) –

+0

danke, ich werde das \ ersetzen, und ich habe das #!/Bin/bash Ich habe es einfach in der Frage weggelassen –

Antwort

0

das Problem gefunden, müssen erst letzte \ von cd Befehl entfernen:

cd ~\cashe 

statt

cd ~\cashe\ 
+0

Das liegt daran, dass du \ anstelle von/I don 'benutzt hast Ich denke, dass ~ \ cashe funktioniert. –

+0

Ja, weil Sie wahrscheinlich unmittelbar nach dem letzten Backslash einen Zeilenabschluss hatten. Der Backslash teilt bash mit, dass der Befehl nicht endet, sondern in der nächsten Zeile fortgesetzt wird. Das heißt, Sie hatten im Grunde einen Befehl 'cd ~ \ casheif [-e portage-latest.tar.xz.gpgsig]', der ungerade, aber syntaktisch legal ist, gefolgt vom reservierten Wort 'then', das nun zu a * wurde * ohne * wenn *. – user1934428

0

Ihre Wege nicht Was du wahrscheinlich denkst, meinen sie. mkdir -p ~\cashe erstellt ein Verzeichnis mit dem Namen ~cashe im aktuellen Verzeichnis und mkdir -p ~\cashe\temp erstellt ein anderes namens ~cashetemp. Zumindest hat das meine Bash getan. Sie möchten wahrscheinlich/anstelle von \ verwenden.

+0

danke habe nicht die falsche \ –

0

Ich würde schreiben, um die 'if' Anweisung mit doppelten eckigen Klammern und auch einen Raum zwischen der äußersten rechten eckigen Klammer, dass die ";", so:

if [[-en ...]]; dann

Es ist meine Erfahrung, dass in der Shell-Programmierung Räume Ihr Freund sind. Ich würde sicherstellen, dass ich zwischen zwei benachbarten syntaktischen Elementen einen Platz einlasse, nur um auf der sicheren Seite zu sein.

+0

"Double eckige Klammern" sind Bash-spezifische Syntax und nicht auf andere Shells tragbar. – miken32

+0

Die Frage ist explizit markiert "bash" –

+0

Nur weil Sie in bash arbeiten, bedeutet nicht, dass es falsch ist, POSIX-kompatiblen, tragbaren Code zu schreiben. – miken32

Verwandte Themen