我正在使用以下脚本,以便调用一个应该迭代数组的函数。
#!/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