Wie kann ich diese Zeichenfolgenmanipulation in eine Schleife einfügen, sodass sie fortgesetzt wird, bis nichts mehr zu tun ist?

Wie kann ich diese Zeichenfolgenmanipulation in eine Schleife einfügen, sodass sie fortgesetzt wird, bis nichts mehr zu tun ist?

Ich erstelle ein Skript, um alle Teile einer URL außer „domain.com“ zu entfernen. Ich habe es geschafft, die meisten zu entfernen, aber ich habe ein Problem mit Unterordnern. Hier ist mein Code:

domain=$1

inp="${domain//http:'//'}"
inp="${inp//https:'//'}"
inp="${inp//www.}"
inp="${inp%/*}"

Das Problem besteht darin, dass ich für jeden Unterordner, den ich abschneiden möchte, eine weitere Regel „inp="${inp%/*}"" erstellen muss. Derzeit kann der Code dort oben nur eine Ebene abschneiden, sodass er bei „www.google.com/hello“ funktionieren würde, aber nicht bei www.google.com/hello/there". Ich könnte zwei der Regeln hinzufügen, um dies zu berücksichtigen, aber ich möchte die Regel nicht 20 Mal wiederholen müssen, um alles zu berücksichtigen.

Gibt es eine Möglichkeit, dies in eine Schleife zu setzen, die erkennt, wann es fertig ist, oder eine bessere Möglichkeit, dies zu tun?

Antwort1

Anstelle von

 inp="${inp%/*}"

Versuchen:

 inp="${inp%%/*}"

Beide dieser Schalensubstitutionen sind Beispiele fürSuffixentfernungDas %Formular löscht diekürzestepassendes Suffix. Im Gegensatz dazu %%entfernt das Formular dasam längstenpassendes Suffix. Wenn Sie also das erste /und alles danach entfernen möchten, verwenden Sie %%/*.

Dokumentation

Aus man bash:

${parameter%word}
${parameter%%word}
Passendes Suffixmuster entfernen. Das Wort wird erweitert, um ein Muster zu erzeugen, genau wie bei der Pfadnamenerweiterung. Wenn das Muster mit einem nachfolgenden Teil des erweiterten Parameterwerts übereinstimmt, ist das Ergebnis der Erweiterung der erweiterte Parameterwert, wobei das kürzeste passende Muster (die %Groß-/Kleinschreibung) oder das längste passende Muster (die %%Groß-/Kleinschreibung) gelöscht wurde. Wenn der Parameter @ oder * ist, wird die Musterentfernungsoperation nacheinander auf jeden Positionsparameter angewendet und die Erweiterung ist die resultierende Liste. Wenn der Parameter eine Arrayvariable ist, die mit @ oder * indiziert ist, wird die Musterentfernungsoperation nacheinander auf jedes Mitglied des Arrays angewendet und die Erweiterung ist die resultierende Liste.

verwandte Informationen