Ich habe eine function
in meiner .bashrc
Akte. Ich weiß, was es tut, es erhöht X viele Verzeichnisse mitcd
Hier ist es:
up()
{
local d=""
limit=$1
for ((i=1 ; i <= limit ; i++))
do
d=$d/..
done
d=$(echo $d | sed 's/^\///')
if [ -z "$d" ]; then
d=..
fi
cd $d
}
Aber können Sie mir diese drei Dinge daraus erklären?
d=$d/..
sed 's/^\///'
d=..
Warum nicht einfach so machen:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Verwendung:
<<<>>>~$ up 3
<<<>>>/$
$OLDPWD
ich dachte daran, mit Füßen getreten zu werden. Und auf zsh mitcd
set soll auch der dirstack verwendet werden.$1
zu ,limit
anstatt nur mit$1
in der Schleife?${1:-1}
stattdessen verwenden, wie in Glenns Variante.d = $ d / ..
Dies verkettet den aktuellen Inhalt von var
d
mit/..
und weist ihn wieder zud
.Das Endergebnis ist,
d
eine wiederholte Zeichenfolge wie zu machen/../../../..
.sed 's / ^ ///'
Entfernen Sie das führende Zeichen
/
aus der angegebenen Zeichenfolged
(echo $ d) in dem von Ihnen geposteten Code.Wahrscheinlich besser geschrieben
sed 's|^/||'
, um den Backslash zu vermeiden.Eine Alternative (schneller und einfacher) ist das Schreiben
d=${d#/}
.d = ..
Weisen Sie die Zeichenfolge
..
an den vard
.Dies ist nur sinnvoll, um sicherzustellen, dass
d
mindestens eine vorhanden ist,..
falls der Testif [ -z "$d" ]; then
signalisiert, dass die Variabled
leer ist. Und das kann nur passieren, weil der Befehl sed ein Zeichen aus entferntd
.Wenn das Zeichen nicht aus d entfernt werden muss, ist
sed
oder nicht erforderlichif
.Der Code in Ihrer Frage wird immer um mindestens ein Verzeichnis nach oben verschoben.
Besser
local d
reicht aus, um sicherzustellen, dass die Variable leer ist, nichts anderes wird benötigt.Lokal funktioniert jedoch nur in einigen Shells wie Bash oder Dash. Insbesondere hat
ksh
(asyash
) keinenlocal
Befehl. Eine tragbarere Lösung ist:Die
for((
Syntax ist nicht portierbar. Verwenden Sie besser so etwas wie:Robust.
Wenn die Werte für das erste Argument der Funktion negativ oder textuell sein können, sollte die Funktion robust sein, um diese Werte zu verarbeiten.
Erstens können die Werte nur Zahlen begrenzen (Ich werde verwenden
c
fürcount
):Und dann beschränken Sie den Zählwert nur auf positive Werte:
Diese Funktion akzeptiert glücklicherweise 0 oder einen beliebigen Text (ohne Fehler):
Entfernen Sie die,
echo \
wenn Sie die Funktion getestet haben.quelle