Warum bekomme ich beim Ausführen eines Skripts [[: nicht gefunden?

14

Ich versuche, ein Skript zu schreiben, das prüfen muss, ob eine Datei vorhanden ist. In die Konsole schreibe ich

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

und ich verstehe

not mod

aber wenn ich ein Skript schreibe, um dasselbe zu tun:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

und dann das Skript ausführen, bekomme ich Folgendes:

./ex.sh: 2: [[: not found
mod

Ich habe das Skript im aktuellen Verzeichnis gespeichert und ex.sh genannt und dann sichergestellt, dass es ausführbar ist. So rufen Sie das Skript auf:

./ex.sh

Warum bekomme ich dieses Problem? Ich habe schon viele Dinge ausprobiert:

if [ -a /home ...

und

if test -a /home ...

Beide kehren zurück

13: -a: unexpected operator
Buzu
quelle
Ich konnte es zum Laufen bringen, aber dafür musste ich die erste Zeile (#! / Bin / sh) entfernen. Weißt du, warum das passiert?
Buzu
try#!/bin/bash
kev
hallo kev, das habe ich auch nachvollzogen. Ich habe gerade meine Frage aktualisiert. Ich habe zu viel Zeit damit verbracht, aber ich bin froh, dass ich es lösen konnte. Danke für deine Antwort. Es ist in der Tat die Lösung für das Problem.
Buzu
@ Kev Bitte poste das als Antwort
slhck
Buzu, @Kev - Wenn Sie eine Antwort finden, posten Sie sie unten als Antwort , und bearbeiten Sie die Frage nicht.
user1686

Antworten:

9

Sie führen ein für bash unter sh geschriebenes Skript aus , dem viele der erweiterten Syntaxfunktionen fehlen. Dies [[ist ein bashintegrierter Befehl und nicht in verfügbar sh.

Ändern Sie #!/bin/shzu #!/bin/bashoder zu #!/usr/bin/env bash.

kev
quelle
Auf einigen Systemen /bin/shist ein Symlink zu /bin/bash. Und es ist wahrscheinlich ziemlich sicher anzunehmen, dass dies der Fall bashist /bin/bash.
Keith Thompson
@ Keith: Es ist /bin/bashauf den meisten Linux-Systemen, aber /usr/pkg/bin/bashauf BSDs, oder /usr/local/bin/bashwenn man direkt aus dem Quellcode kompiliert.
user1686
@grawity: Oder wo immer Sie sich entscheiden, es zu platzieren, wenn Sie aus dem Quellcode kompilieren. Ok, guter Punkt. Persönlich würde ich lieber den Shebang für jedes System bearbeiten, als den /usr/bin/envHack (der verwendet, was auch bashimmer gerade in den Anrufern ist $PATH), aber YMMV. (Und Sie können /bin/basheinen Symlink erstellen - wenn Sie Administratorrechte haben und nichts dagegen haben, sich damit zu beschäftigen /bin.)
Keith Thompson
@Keith: /usr/localHier legt autotools die Standardeinstellung fest. Was "persönlich" anbelangt, mag ich es, wenn mehrere verschiedene Server und VMs aus demselben Skript- / Tool-Repository abgerufen werden und nicht die Hälfte von ihnen nach jedem Commit erneut bearbeitet werden muss.
user1686
Keiner von ihnen hat für mich gearbeitet: / im on centos
astroanu
0

Geben Sie bash anstelle von sh an, wenn Sie das Skript ausführen. Ich persönlich habe festgestellt, dass sie unter Ubuntu 12.10 unterschiedlich sind:

bash script.sh arg0 ... argn

Smeterlink
quelle