For-Schleife funktioniert nicht in einer Funktion mit Argumenten

For-Schleife funktioniert nicht in einer Funktion mit Argumenten

Ich erstelle also eine Funktion, die eine For-Schleife für alle Dateien in einem Verzeichnis mit einem gegebenen Argument ausführt und alle Dateien und Verzeichnisse ausgibt:

#!/bin/bash

List () {
    for item in $1
            do
            echo "$item"
            done
}

List ~/*

Wenn ich das Skript ausführe, wird jedoch nur die erste Datei im Verzeichnis ausgedruckt.

Irgendwelche Ideen?

Antwort1

Wenn Sie versuchen, über Dateien in einem Verzeichnis zu iterieren, müssen Sie das Verzeichnis folgendermaßen globgen:

#!/bin/bash

List () {
    for item in "${1}/"*
            do
            echo "$item"
    done
}

Dann nenne es so:

$ list ~

Wenn Sie mehrere Dateien als Argumente übergeben möchten, können Sie Ihre forSchleife alternativ folgendermaßen schreiben:

List () {
    for item
            do
            echo "$item"
    done
}

Das kann dann wie folgt aufgerufen werden:

$ list ~/*

Was ist falsch an Ihrer aktuellen Funktion:

Wenn Sie es mit einem Glob aufrufen, übergibt es jede Datei im Verzeichnis als separates Argument. Nehmen wir an, Ihr Home-Verzeichnis enthält file1, file2, und file3. Wenn Sie aufrufen list ~/*, rufen Sie im Wesentlichen Folgendes auf:

list ~/file1 ~/file2 ~/file3

Dann wird Ihrer forSchleife nur der Positionsparameter 1 übergeben for item in ~/file1und die anderen Positionsparameter bleiben ungenutzt.

Danke auch an Ilkkachu für den Hinweis, dass du /in deinem Hashbang auch ein vergessen hast, was mir völlig entgangen ist.

verwandte Informationen