配列を繰り返す関数

配列を繰り返す関数

配列を繰り返す必要がある関数を呼び出すには、次のスクリプトを使用しています。

#!/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

なぜ最初の配列項目だけを印刷するのですか?

編集する:もっと重要なのは、追加のパラメータを使用できるようにしたいということです(配列に加えて "$ @"を使用している場合は、2番目のパラメータにどのようにアクセスしますか?)

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

関連情報