For loop não funciona em uma função com argumentos

For loop não funciona em uma função com argumentos

Então, estou criando uma função que faz um loop for em todos os arquivos de um diretório como um determinado argumento e imprime todos os arquivos e diretórios:

#!/bin/bash

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

List ~/*

No entanto, quando executo o script, ele imprime apenas o primeiro arquivo do diretório.

Alguma ideia?

Responder1

Se você estiver tentando iterar arquivos em um diretório, precisará globá-lo da seguinte forma:

#!/bin/bash

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

Então chame assim:

$ list ~

Alternativamente, se você quiser passar vários arquivos como argumentos, você pode escrever seu forloop assim:

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

Que pode então ser chamado como:

$ list ~/*

O que há de errado com sua função atual:

Quando você o chama com um glob, ele passa cada arquivo no diretório como um argumento separado. Digamos que seu diretório inicial contenha file1, file2e file3. Quando você liga list ~/*, você está essencialmente ligando:

list ~/file1 ~/file2 ~/file3

Então seu forloop está recebendo apenas o parâmetro posicional 1 for item in ~/file1e os outros parâmetros posicionais não são utilizados.

Agradeço também a Ilkkachu por apontar que você também esqueceu um /no seu hashbang, o que eu perdi completamente.

informação relacionada