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
bash
shell-script
Buzu
quelle
quelle
#!/bin/bash
Antworten:
Sie führen ein für bash unter sh geschriebenes Skript aus , dem viele der erweiterten Syntaxfunktionen fehlen. Dies
[[
ist einbash
integrierter Befehl und nicht in verfügbarsh
.Ändern Sie
#!/bin/sh
zu#!/bin/bash
oder zu#!/usr/bin/env bash
.quelle
/bin/sh
ist ein Symlink zu/bin/bash
. Und es ist wahrscheinlich ziemlich sicher anzunehmen, dass dies der Fallbash
ist/bin/bash
./bin/bash
auf den meisten Linux-Systemen, aber/usr/pkg/bin/bash
auf BSDs, oder/usr/local/bin/bash
wenn man direkt aus dem Quellcode kompiliert./usr/bin/env
Hack (der verwendet, was auchbash
immer gerade in den Anrufern ist$PATH
), aber YMMV. (Und Sie können/bin/bash
einen Symlink erstellen - wenn Sie Administratorrechte haben und nichts dagegen haben, sich damit zu beschäftigen/bin
.)/usr/local
Hier 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.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
quelle