Überprüfen Sie, ob das Verzeichnis mit dem Startzeichen (~) in der Bash existiert


16

Warum bashüberprüft das Folgende , ob ein Verzeichnis fehlschlägt?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktopexistiert tatsächlich. Dies ist übrigens auf einem Mac.


Das Problem liegt bei dieser Art von Skript

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi

1
Genau wie wenn Sie es tun, erhalten cd "~/Desktop"Sie auch eine Fehlermeldung. Es muss nicht in Anführungszeichen gesetzt oder als Variable gespeichert werden (ohne Anführungszeichen). Beispiel: Funktioniert, a=~/Desktop; cd $a;aber nicht a="~/Desktop"; cd Desktop;Siehe serverfault.com/questions/417252/…
dylnmc

Antworten:


7

Justin hat seine Frage in seinem ersten Kommentar zu Quantas Antwort geklärt. Er liest eine Textzeile mit read(oder auf andere dynamische Weise) und möchte die Tilde erweitern.

Die Frage lautet: "Wie können Sie den Inhalt einer Variablen um eine Tilde erweitern?"

Der allgemeine Ansatz ist zu verwenden eval, bringt jedoch einige wichtige Einschränkungen mit sich, nämlich Leerzeichen und Ausgabeumleitung ( >) in der Variablen. Folgendes scheint für mich zu funktionieren:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

Probieren Sie es mit den folgenden Eingaben aus:

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

Erläuterung

  • Die ${mypath//>}Streifen aus >Zeichen , die eine Datei während des clobber könnte eval.
  • Das eval echo ...ist es, was die eigentliche Tilde-Erweiterung bewirkt
  • Die doppelten Anführungszeichen um evalstehen für die Unterstützung von Dateinamen mit Leerzeichen.

Ergänzend dazu können Sie die UX verbessern, indem Sie die folgende -eOption hinzufügen :

read -p "Provide the destination directory: " -e DESTINATION

Wenn der Benutzer nun die Registerkarte "Tilde" und "Treffer" eingibt, wird sie erweitert. Dieser Ansatz nicht ersetzt den eval Ansatz vor, jedoch, da die Expansion geschieht nur , wenn der Benutzer Tab trifft. Wenn er nur ~ / foo eingibt und die Eingabetaste drückt, bleibt es eine Tilde.

Siehe auch:


23

Entfernen Sie die doppelten Anführungszeichen um das Verzeichnis, um zu sehen, ob es funktioniert:

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

Der Grund dafür ist, dass die Tilde-Erweiterung nur funktioniert, wenn sie nicht zitiert ist.

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

Wie wäre es, wenn der Wert dynamisch eingeht. Dh ( pastie.org/4471350 ) und DESTINATIONist ~/Desktop.
Justin

3
Die Tilde-Erweiterung wird durchgeführt, wenn die Variable gesetzt ist, nicht, wenn sie ausgewertet wird. Das ist also kein faires Beispiel.
MadHatter unterstützt Monica

+1, das ist genug, um mein Problem zu lösen.
Flying Fisher


1

Lauf

echo $HOME

Verwenden Sie $HOMEund stellen Sie sicher, dass der Benutzer das Skript tatsächlich verwendet. Wenn root es benutzt ~, wird es nachsehen /root, nicht /home/$USER.

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

sollte $ HOME anstelle von ~ sein

~ ist eine KEYBOARD-Sache


Wenn Sie die andere Antwort hier lesen, werden Sie feststellen, dass dies falsch ist.
Küken
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.