Ich versuche, ein extrem einfaches Skript in Ubuntu zu schreiben, das es mir ermöglicht, entweder einen Dateinamen oder ein Verzeichnis zu übergeben und etwas Bestimmtes zu tun, wenn es sich um eine Datei handelt, und etwas anderes, wenn es sich um ein Verzeichnis handelt. Das Problem, das ich habe, ist, wenn der Verzeichnisname oder wahrscheinlich auch Dateien Leerzeichen oder andere Zeichen enthalten.
Hier ist mein Basiscode unten und ein paar Tests.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
Und hier ist die Ausgabe:
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
Alle diese Pfade sind gültig und existieren.
if
-else
Konstrukte in Bash unterstützen ebenfallselif
. Nur zur Info.Antworten:
Das sollte funktionieren. Ich bin mir nicht sicher, warum es fehlschlägt. Sie zitieren Ihre Variablen richtig. Was passiert, wenn Sie dieses Skript mit double verwenden
[[
]]
?Doppelte eckige Klammern sind eine Bash-Erweiterung für
[ ]
. Variablen müssen nicht in Anführungszeichen gesetzt werden, auch wenn sie Leerzeichen enthalten.Es lohnt sich auch zu versuchen:
-e
zu testen, ob ein Pfad vorhanden ist, ohne zu testen, um welchen Dateityp es sich handelt.quelle
Schreiben Sie zumindest den Code ohne den buschigen Baum:
Wenn ich das in eine Datei "xx.sh" lege und eine Datei "xx sh" erstelle und ausführe, erhalte ich:
Wenn Sie Probleme haben, sollten Sie das Skript debuggen, indem Sie Folgendes hinzufügen:
Dies zeigt Ihnen, was Sie
ls
über die Namen denken, an die Sie das Skript übergeben.quelle
Die Verwendung des Befehls "Datei" kann hierfür hilfreich sein:
Ausgabebeispiele:
Zu Ihrer Information: Die obigen Antworten funktionieren, aber Sie können -s verwenden, um in seltsamen Situationen zu helfen, indem Sie zuerst nach einer gültigen Datei suchen:
quelle
-s
nach einer nicht leeren Datei mit einer Größe ungleich Null gesucht wird)? Und Sie werden keine Diagnose für ein Block-Special, ein Character-Special, ein FIFO usw. drucken? Symlinks lösen sich wahrscheinlich auf, was sich am anderen Ende des Links befindet. defekte Symlinks sind problematischer.--brief
Flagge vonfile
. Es wird nur ausgegeben,directory
wenn es ist.Verwenden
-f
und-d
Einschalten/bin/test
:quelle
test
ist normalerweise eine Shell eingebaut, obwohl es normalerweise auch eine ausführbare Datei wie/bin/test
und gibt/bin/[
.)Eine elegantere Lösung
quelle
if [ -f "$x" ]
.quelle
Das sollte funktionieren:
quelle
quelle
Einzeiler
Ergebnis ist wahr (0) (dir) oder wahr (0) (Datei) oder falsch (1) (weder)
quelle
touch bob
mitmkdir bob
, erhalte ich die Ausgabe:dir
undfile
auf zwei Linien.