배열을 반복해야 하는 함수를 호출하기 위해 다음 스크립트를 사용하고 있습니다.
#!/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