배열을 반복하는 함수

배열을 반복하는 함수

배열을 반복해야 하는 함수를 호출하기 위해 다음 스크립트를 사용하고 있습니다.

#!/bin/bash

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

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

iterarr "${myarr[@]}"

그러나 실행하면 다음과 같은 결과가 출력됩니다.

/dir1/file1.md

왜 첫 번째 배열 항목만 인쇄합니까?

편집하다:더 중요한 것은 추가 매개변수를 사용할 수 있기를 원한다는 것입니다(배열 외에 "$@"를 사용하는 경우 두 번째 매개변수에 어떻게 액세스합니까?)

Ubuntu 16.04.03작업

*$ $(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>

답변1

iterarr "${myarr[@]}"확장되고 iterarr '/dir1/file1.md' '/dir1/file2.md' 'README.md'루프 내에서는 첫 번째 매개변수만 참조하게 됩니다 "$1". 대신 "$@"모든 매개변수에 대해 루프를 사용하세요.

#!/bin/bash

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

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

iterarr "${myarr[@]}"

플래그나 위치 매개변수를 처리하려면 배열 앞에 놓고 먼저 처리하세요. 완료되면 이동하면 배열에서 제거됩니다 "$@".

#!/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[@]}"

답변2

현재 버전의 bash의 경우 다음을 사용하십시오."이름 참조"배열 전달이름으로:

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

관련 정보