Função para iterar pelo array

1

Estou usando o script a seguir, para chamar uma função que deve ser iterada em uma matriz.

#!/bin/bash

function iterarr {
    for item in "$1"
    do
        echo "$item"
    done
}

myarr=(/dir1/file1.md /dir1/file2.md README.md)

iterarr "${myarr[@]}"

No entanto, quando eu o executo, ele fornece a seguinte saída.

/dir1/file1.md

Por que imprime apenas a primeira entrada da matriz?

edit : O que é mais, eu gostaria de poder usar um argumento adicional (além do array, então se eu usar '$ @', como eu acesso o segundo argumento?)

Trabalhando em Ubuntu 16.04.03 com ...

*$ $(which bash) --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    
por pkaramol 27.10.2017 / 15:33

2 respostas

4

iterarr "${myarr[@]}" expandirá para iterarr '/dir1/file1.md' '/dir1/file2.md' 'README.md' e, em seu loop, você fará referência apenas ao primeiro argumento com "$1" . Em vez disso, use "$@" para repetir todos os argumentos.

#!/bin/bash

function iterarr {
    for item in "$@"
    do
        echo "$item"
    done
}

myarr=(/dir1/file1.md /dir1/file2.md README.md)

iterarr "${myarr[@]}"

Se você quiser processar sinalizadores ou argumentos posicionais, coloque-os antes do array e manipule-os primeiro, deslocando-os quando concluído os removerá de "$@" ,

#!/bin/bash

function iterarr {
    echo "first argument is : '$1'"
    shift
    for item in "$@"
    do
        echo "$item"
    done
}

myarr=(/dir1/file1.md /dir1/file2.md README.md)

iterarr firstarg "${myarr[@]}"
    
por 27.10.2017 / 15:42
1

Com esta versão atual do bash, use um "nameref" para passe o array pelo nome :

iterarr() {
    local -n local_arr=$1
    for item in "${local_arr[@]}"; do echo "$item"; done
}

myarr=(/dir1/file1.md /dir1/file2.md README.md)

iterarr myarr
/dir1/file1.md
/dir1/file2.md
README.md
    
por 27.10.2017 / 16:21