迭代数组的函数

迭代数组的函数

我正在使用以下脚本,以便调用一个应该迭代数组的函数。

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

相关内容