配列を繰り返す必要がある関数を呼び出すには、次のスクリプトを使用しています。
#!/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