Para loop não está funcionando em uma função com argumentos

2

Portanto, estou criando uma função que faz um loop for em todos os arquivos em 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 apenas imprime o primeiro arquivo no diretório.

Alguma idéia?

    
por David Mathers 02.06.2018 / 22:16

1 resposta

3

Se você estiver tentando fazer a iteração de arquivos em um diretório, precisará globalizar o diretório da seguinte forma:

#!/bin/bash

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

Em seguida, chame como:

$ list ~

Alternativamente, se você quiser passar múltiplos arquivos como argumentos, você pode escrever o seu laço for 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 pessoal contenha file1 , file2 e file3 . Quando você chama list ~/* , você está essencialmente chamando:

list ~/file1 ~/file2 ~/file3

Então o seu for loop está sendo passado apenas pelo parâmetro posicional 1, então for item in ~/file1 e os outros parâmetros posicionais não são usados.

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

    
por 02.06.2018 / 22:23

Tags