bash에서 배열을 매개 변수로 전달


188

bash 함수에 배열을 매개 변수로 전달하려면 어떻게해야합니까?

참고 : 스택 오버플로에 대한 답변을 찾지 못한 후 다소 조잡한 솔루션을 직접 게시했습니다. 하나의 배열 만 전달할 수 있으며 매개 변수 목록의 마지막 요소입니다. 실제로, 그것은 배열을 전혀 전달하지 않고, 그 요소의 목록을, called_function ()에 의해 배열로 다시 어셈블하지만, 그것은 나를 위해 일했습니다. 누군가 더 나은 방법을 알고 있다면 여기에 자유롭게 추가하십시오.


1
여기에 좋은 참고 자료와 수많은 예제가 있습니다.
Artem Barger

16
Errr ... 같은 순간에 5 살짜리 질문에 3 명의 다운 보트?
DevSolar

답변:


220

다음과 같이 여러 배열을 인수로 전달할 수 있습니다 .

takes_ary_as_arg()
{
    declare -a argAry1=("${!1}")
    echo "${argAry1[@]}"

    declare -a argAry2=("${!2}")
    echo "${argAry2[@]}"
}
try_with_local_arys()
{
    # array variables could have local scope
    local descTable=(
        "sli4-iread"
        "sli4-iwrite"
        "sli3-iread"
        "sli3-iwrite"
    )
    local optsTable=(
        "--msix  --iread"
        "--msix  --iwrite"
        "--msi   --iread"
        "--msi   --iwrite"
    )
    takes_ary_as_arg descTable[@] optsTable[@]
}
try_with_local_arys

에코 :

sli4-iread sli4-iwrite sli3-iread sli3-iwrite  
--msix  --iread --msix  --iwrite --msi   --iread --msi   --iwrite

편집 / 노트 : (아래 주석에서)

  • descTableoptsTable이름으로 전달하고 함수에 확장됩니다. 따라서 $매개 변수로 제공 될 때 필요 하지 않습니다 .
  • 이것은 여전히 descTableetc로 정의 된 경우에도 작동합니다.local로케일이 호출하는 함수에 표시되므로, .
  • !에서이 ${!1}인자 저장 한 변수를 확장한다.
  • declare -a 인덱스 배열을 명시 적으로 만들면 꼭 필요한 것은 아닙니다.

14
한 가지 주목할 점은 원래 배열이 드문 경우 수신 함수의 배열이 동일한 인덱스를 가지지 않는다는 것입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

13
이것은 훌륭하지만 Ken 또는 누군가가 왜 작동하는지에 대해 나를 괴롭히는 몇 가지 사항을 설명 할 수 있습니다. 1-함수 인수로 전달 될 때 descTable 및 optsTable 앞에 $가 있어야한다고 생각했을 것입니다. 2- "takes ..."의 첫 줄에서 왜 명시적인 배열 선언이 필요한가? 3-그리고 무엇을 하는가! $ {! 1} 표현에 의미가 있는데, 왜 [@]가 필요하지 않습니까? -이것은 효과가 있으며 모든 세부 사항은 내 테스트를 기반으로 필요한 것으로 보이지만 그 이유를 이해하고 싶습니다!
Jan Hettich

8
1 : descTable과 optsTable은 단지 이름으로 전달되므로 $가 없으므로 호출 된 함수에서만 확장됩니다 2 : 완전히 확실하지는 않지만 실제로 필요하지는 않습니다. 함수에 전달 된 매개 변수는 두 번 확장되어야하기 때문에 사용됩니다. $ 1은 "descTable [@]"으로 확장되고 "$ {descTable [@]}"로 확장되어야합니다. $ {! 1} 구문은이 작업을 수행합니다.
Elmar Zander

8
"declare -a"부분이 필요하지 않다고 생각합니다. 괄호가 있으면 할당의 LHS가 이미 배열로 정의됩니다.
Erik Aronesty

3
이 답변은 지금 문제를 해결하는 데 도움이되었습니다. 그러나 내 컴퓨터 (bash 4.3.42 사용)에서 "$ {! 1}"및 "$ {! 2}"는 따옴표를 제거해야한다고 지적하고 싶습니다. 그렇지 않으면 원래 배열의 값이 하나의 문자열로 읽히고 argAry1 [0] 및 argAry2 [0]에 각각 할당됩니다. 기본적으로 배열 구조가 손실됩니다.
user.friendly

85

참고 : 이것은 스택 오버플로에 대한 답변을 찾지 못한 후에 내가 게시 한 다소 조잡한 솔루션입니다. 하나의 배열 만 전달할 수 있으며 매개 변수 목록의 마지막 요소입니다. 실제로, 그것은 배열을 전혀 전달하지 않고, 그 요소의 목록을, called_function ()에 의해 배열로 다시 어셈블하지만, 그것은 나를 위해 일했습니다. 나중에 Ken은 자신의 솔루션을 게시했지만 "역사적"참조를 위해 여기에 보관했습니다.

calling_function()
{
    variable="a"
    array=( "x", "y", "z" )
    called_function "${variable}" "${array[@]}"
}

called_function()
{
    local_variable="${1}"
    shift
    local_array=("${@}")
}

TheBonsai에 의해 향상되었습니다.


19
사실 3 년 후,이 답변은 역사적 이유로 만 유지되었으며 며칠 내에 2 개의 다운 보트를 받았습니다. 슬프게도 평소와 같이 사람들이 왜 이것이 정당하다고 생각하는지에 대한 언급없이. 이 답변은 다른 모든 것 보다 우선하며 Ken의 답변을 최상의 솔루션으로 받아 들였습니다. 나는 그것이 완벽에 가깝지는 않다는 것을 완벽하게 알고 있지만 4 개월 동안 SO에서 가장 잘 사용되었습니다. Ken의 완벽한 솔루션으로 2 위를 차지한 지 2 년이 지난 후 다운 보트를 받아야하는 이유 는 저를 넘어선 것입니다.
DevSolar

@geirha : 질문을 게시 한 사람,이 답변을 게시 한 사람 및 "나쁜"전화를받은 응답을 누가 수락 했는지 확인하도록 요청합니다 . ;-) 이 솔루션이 왜 Ken보다 열등한 지 지적한 문제 의 메모 를 확인하고 싶을 수도 있습니다 .
DevSolar

2
나는 당신이 그 질문을하고, 당신은이 답변을 썼으며, 당신은 잘못된 대답을 받아 들였다는 것을 알고 있습니다. 그래서 내가 그렇게 말 했어요. 허용 된 답변이 나쁜 이유는 참조로 배열을 전달하려고하기 때문에 실제로 피해야합니다. 또한이 예에서는 여러 인수를 단일 문자열로 매시합니다. 참조로 배열을 전달 해야하는 경우 bash는 처음에 잘못된 언어입니다. bash 4.3의 새로운 nameref 변수를 사용해도 이름 충돌 (원형 참조)을 피할 수 없습니다.
geirha

4
각 배열의 요소 수를 포함하면 여러 배열을 전달할 수 있습니다. called_function "${#array[@]}" "${array[@]}" "${#array2[@]}" "${array2[@]}"등 ... 여전히 명백한 제한이 있지만 실제로 언어를 다른 언어에서 익숙한 방식으로 구부리기보다는 언어가 지원하는 방식으로 문제를 해결하는 것이 좋습니다.
geirha

1
@geirha : 글쎄, 우리는 우리가 동의하지 않는다는 것에 동의해야 할 것 같아. 내 질문에 가장 잘 맞는 답을 판사로 내버려 두어야 할 것이다. 개인적으로, 어쨌든 데이터 복사를 저장하기 위해 언어에 관계없이 참조로 배열을 전달하는 것이 좋습니다 . 대안이 뒤로 구부러지고 배열 크기를 추가 매개 변수로 전달할 때 훨씬 더 ...
DevSolar

38

Ken Bertelson 솔루션에 대해 논평하고 Jan Hettich에게 답변 :

작동 원리

함수 의 takes_ary_as_arg descTable[@] optsTable[@]라인은 try_with_local_arys()다음을 보냅니다.

  1. 이것은 실제로 에 액세스 할 수 있는 descTableoptsTable배열 의 복사본을 만듭니다 .takes_ary_as_arg 함수에 .
  2. takes_ary_as_arg()함수는 수신 descTable[@]optsTable[@]문자열한다는 뜻 $1 == descTable[@]하고$2 == optsTable[@] .
  3. takes_ary_as_arg()함수 의 시작 부분 에서는 간접 참조 또는 때로는 이중 참조${!parameter} 라고 하는 구문 을 사용 합니다. 이는 을 사용 하는 대신 확장의 값 을 사용 한다는 것을 의미합니다 . 예 :$1$1

    baba=booba
    variable=baba
    echo ${variable} # baba
    echo ${!variable} # booba

    마찬가지로 $2 .

  4. 이것을 넣으면 직접 쓰는 것처럼 확장 된 배열 (다음에 괄호 ) 이 argAry1=("${!1}")만들어집니다 . 이 필요하지 않습니다.argAry1=descTable[@]argAry1=("${descTable[@]}")declare

주의 : 이 상당이 브래킷 형태를 이용하여 해당 배열 초기화 언급이에 따른 새로운 배열이다 초기화 IFS하거나 내부 필드 구분 기본으로 인 , 개행공간 . 이 경우 [@]표기법 을 사용했기 때문에 각 요소는 마치 인용 된 것처럼 보입니다 (와 반대로 [*]).

그것으로 내 예약

에서 BASH지역 변수의 범위는 현재의 기능과 호출 모든 어린이 기능입니다,이 사실에 번역 takes_ary_as_arg()기능이 그 "인식" descTable[@]optsTable[@]배열, 따라서이 작동 (설명 위 참조).

이 경우 왜 변수 자체를 직접 보지 않겠습니까? 그것은 거기에 쓰는 것과 같습니다.

argAry1=("${descTable[@]}")

descTable[@]current에 따라 배열의 값을 복사하는 위의 설명을 참조하십시오 IFS.

요약해서 말하자면

이것은 본질적으로 평소와 같이 가치에 의한 것이 아닙니다.

또한 위의 Dennis Williamson의 의견을 강조하고 싶습니다. 희소 배열 (모든 키가 정의되지 않은 배열- "구멍"이있는 배열)은 예상대로 작동하지 않습니다. 우리는 키를 풀고 배열을 "축합"합니다.

즉, 일반화의 가치를 알 수 있으므로 함수는 이름을 몰라도 배열 (또는 사본)을 얻을 수 있습니다.

  • ~ "복사본"의 경우 :이 기술은 충분하며 인덱스 (키)가 없어 졌다는 사실 만 알고 있어야합니다.
  • 실제 사본의 경우 키에 eval을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    eval local keys=(\${!$1})

그런 다음 루프를 사용하여 사본을 만듭니다. 참고 : 여기 !에서는 이전 간접 / 이중 평가가 아니라 배열 컨텍스트에서 배열 인덱스 (키)를 반환합니다.

  • 물론 우리가 전달 descTable하고 optsTable문자열을 ()없이 [@]사용한다면 배열 자체를 (참조로) 사용할 수 있습니다 eval. 배열을 받아들이는 일반 함수

2
Ken Bertelson 설명의 메커니즘에 대한 좋은 설명. "이러한 변수를 직접 보지 않는 이유는 무엇입니까?" 하자 내가 가진 함수를 호출해야 할 말 Array1과 다음, Array2편리하게 배열 이름을 전달.
gfrigon

좋은 대답입니다, 우리는 이와 같은 더 많은 설명이 필요합니다!
Édouard Lopez

22

여기서 기본적인 문제는 배열을 설계 / 구현 한 배쉬 개발자가 실제로 문제를 해결했다는 것입니다. 그들은을 ${array}위한 짧은 손 이라고 결정했습니다 ${array[0]}. 이것은 나쁜 실수입니다. 특히 당신이 그것을 고려할 때${array[0]} 배열 유형이 연관되어 있으면 의미가 없으며 빈 문자열로 평가됩니다.

배열 을 할당하면 value에 array=(value1 ... valueN)구문 이있는 형식이 사용되므로 배열 [subscript]=string의 특정 인덱스에 직접 값을 할당 할 수 있습니다. 이를 통해 숫자 인덱스와 해시 인덱스 (bash 괄호에서 연관 배열이라고 함)의 두 가지 유형의 배열이 가능합니다. 또한 희소하게 숫자 인덱스 된 배열을 만들 수 있습니다. 오프 떠나는 [subscript]=부분은 0의 서수 인덱스에서 시작하여 할당 문에서 각각 새 값으로 증가하는 숫자 인덱스 배열 짧은 손입니다.

따라서 전체 배열, 인덱스 및 모두로 ${array}평가해야 합니다. 대입 문의 역으로 ​​평가해야합니다. 3 학년 CS 전공은이를 알아야합니다. 이 경우이 코드는 예상 한대로 작동합니다.

declare -A foo bar
foo=${bar}

그런 다음 값으로 배열을 함수에 전달하고 하나의 배열을 다른 배열에 지정하면 나머지 쉘 구문이 지시하는대로 작동합니다. 그러나이 작업을 제대로 수행하지 않았기 때문에 할당 연산자 =는 배열에서 작동하지 않으며 값을 통해 함수 또는 하위 셸 또는 일반적으로 ( echo ${array}) 출력으로 배열을 전달할 수 없습니다 .

따라서 올바르게 수행 된 경우 다음 예제는 bash에서 배열의 유용성이 실질적으로 더 나은 방법을 보여줍니다.

simple=(first=one second=2 third=3)
echo ${simple}

결과 출력은 다음과 같아야합니다.

(first=one second=2 third=3)

그런 다음 배열은 대입 연산자를 사용하고 값을 통해 함수 및 다른 셸 스크립트에 전달할 수 있습니다. 파일로 출력하여 쉽게 저장하고 파일에서 스크립트로 쉽게로드 할 수 있습니다.

declare -A foo
read foo <file

아아, 우리는 다른 최상급 배쉬 개발 팀에 의해 실망했습니다.

따라서 배열을 함수에 전달하려면 실제로 하나의 옵션 만 있으며 nameref 기능을 사용하는 것입니다.

function funky() {
    local -n ARR

    ARR=$1
    echo "indexes: ${!ARR[@]}"
    echo "values: ${ARR[@]}"
}

declare -A HASH

HASH=([foo]=bar [zoom]=fast)
funky HASH # notice that I'm just passing the word 'HASH' to the function

결과는 다음과 같습니다.

indexes: foo zoom
values: bar fast

이것은 참조로 전달되므로 함수의 배열에 할당 할 수도 있습니다. 예, 참조되는 배열은 전역 범위를 가져야하지만 이것이 쉘 스크립팅이라는 점을 고려할 때 너무 큰해서는 안됩니다. 연관 또는 희소 색인 배열을 값으로 함수에 전달하려면 모든 색인과 값을 인수 목록 (큰 배열 인 경우 너무 유용하지 않음)에 다음과 같은 단일 문자열로 던져야합니다.

funky "${!array[*]}" "${array[*]}"

그런 다음 함수 내부에 많은 코드를 작성하여 배열을 다시 어셈블합니다.


1
사용하는 솔루션은 local -n허용되는 답변보다 더 낫고 최신입니다. 이 솔루션은 모든 유형의 변수에도 적용됩니다. 이 답변에 나열된 예는로 단축 될 수 있습니다 local -n ARR=${1}. 그러나 / -n옵션 은 Bash 버전 4.3 이상에서만 사용할 수 있습니다. localdeclare
richardjsimkins

이거 좋은데! 작은 문제 : 함수의 로컬 인수와 같은 이름을 가진 변수를 전달하면 (예 funky ARR:) 쉘은 circular name reference기본적으로 함수가 시도하기 때문에 경고 를 표시 local -n ARR=ARR합니다. 이 주제에 대한 좋은 토론 .
유전자 Pavlovsky

5

DevSolar의 대답에는 이해할 수없는 한 가지 점이 있습니다 (아마도 특별한 이유가 있지만 생각할 수는 없습니다) : 그는 위치 매개 변수에서 요소별로 배열을 반복적으로 설정합니다.

더 쉬운 approuch는

called_function()
{
  ...
  # do everything like shown by DevSolar
  ...

  # now get a copy of the positional parameters
  local_array=("$@")
  ...
}

1
그렇게하지 않는 이유는 며칠 전까지 bash 배열을 전혀 사용하지 않았기 때문입니다. 이전에는 복잡해지면 현재 작업에없는 옵션 인 Perl로 전환했습니다. 힌트 주셔서 감사합니다!
DevSolar 2016 년


3

여러 배열을 매개 변수로 전달하는 쉬운 방법은 문자로 구분 된 문자열을 사용하는 것입니다. 다음과 같이 스크립트를 호출 할 수 있습니다.

./myScript.sh "value1;value2;value3" "somethingElse" "value4;value5" "anotherOne"

그런 다음 코드에서 다음과 같이 추출 할 수 있습니다.

myArray=$1
IFS=';' read -a myArray <<< "$myArray"

myOtherArray=$3
IFS=';' read -a myOtherArray <<< "$myOtherArray"

이 방법으로 실제로 여러 배열을 매개 변수로 전달할 수 있으며 마지막 매개 변수 일 필요는 없습니다.


1

이것은 공백에서도 작동합니다.

format="\t%2s - %s\n"

function doAction
{
  local_array=("$@")
  for (( i = 0 ; i < ${#local_array[@]} ; i++ ))
    do
      printf "${format}" $i "${local_array[$i]}"
  done
  echo -n "Choose: "
  option=""
  read -n1 option
  echo ${local_array[option]}
  return
}

#the call:
doAction "${tools[@]}"

2
요점이 무엇인지 궁금합니다. 이것은 정상적인 인수 전달입니다. "$ @"구문은 공백에 대해 작동하도록 만들어졌습니다. "$ @"은 "$ 1" "$ 2"와 같습니다.
Andreas Spindler

함수에 2 개의 배열을 전달할 수 있습니까?
pihentagy 2016

1

몇 가지 트릭을 사용하면 실제로 명명 된 매개 변수를 배열과 함께 함수에 전달할 수 있습니다.

내가 개발 한 방법을 사용하면 다음과 같은 함수에 전달 된 매개 변수에 액세스 할 수 있습니다

testPassingParams() {

    @var hello
    l=4 @array anArrayWithFourElements
    l=2 @array anotherArrayWithTwo
    @var anotherSingle
    @reference table   # references only work in bash >=4.3
    @params anArrayOfVariedSize

    test "$hello" = "$1" && echo correct
    #
    test "${anArrayWithFourElements[0]}" = "$2" && echo correct
    test "${anArrayWithFourElements[1]}" = "$3" && echo correct
    test "${anArrayWithFourElements[2]}" = "$4" && echo correct
    # etc...
    #
    test "${anotherArrayWithTwo[0]}" = "$6" && echo correct
    test "${anotherArrayWithTwo[1]}" = "$7" && echo correct
    #
    test "$anotherSingle" = "$8" && echo correct
    #
    test "${table[test]}" = "works"
    table[inside]="adding a new value"
    #
    # I'm using * just in this example:
    test "${anArrayOfVariedSize[*]}" = "${*:10}" && echo correct
}

fourElements=( a1 a2 "a3 with spaces" a4 )
twoElements=( b1 b2 )
declare -A assocArray
assocArray[test]="works"

testPassingParams "first" "${fourElements[@]}" "${twoElements[@]}" "single with spaces" assocArray "and more... " "even more..."

test "${assocArray[inside]}" = "adding a new value"

다시 말해, 이름으로 매개 변수를 호출 할 수있을뿐만 아니라 (더 읽기 쉬운 코어를 구성 함) 실제로 배열을 전달할 수 있습니다 (변수에 대한 참조-이 기능은 bash 4.3에서만 작동합니다). 또한 매핑 된 변수는 모두 $ 1 (및 기타)과 같이 로컬 범위에 있습니다.

이 작업을 수행하는 코드는 매우 가볍고 bash 3 및 bash 4에서 모두 작동합니다 (이것은 내가 테스트 한 유일한 버전입니다). bash로 개발하는 것을 훨씬 더 좋고 쉽게 만드는 더 많은 트릭에 관심이 있다면 Bash Infinity Framework를 살펴보십시오. 아래 코드는 그 목적을 위해 개발되었습니다.

Function.AssignParamLocally() {
    local commandWithArgs=( $1 )
    local command="${commandWithArgs[0]}"

    shift

    if [[ "$command" == "trap" || "$command" == "l="* || "$command" == "_type="* ]]
    then
        paramNo+=-1
        return 0
    fi

    if [[ "$command" != "local" ]]
    then
        assignNormalCodeStarted=true
    fi

    local varDeclaration="${commandWithArgs[1]}"
    if [[ $varDeclaration == '-n' ]]
    then
        varDeclaration="${commandWithArgs[2]}"
    fi
    local varName="${varDeclaration%%=*}"

    # var value is only important if making an object later on from it
    local varValue="${varDeclaration#*=}"

    if [[ ! -z $assignVarType ]]
    then
        local previousParamNo=$(expr $paramNo - 1)

        if [[ "$assignVarType" == "array" ]]
        then
            # passing array:
            execute="$assignVarName=( \"\${@:$previousParamNo:$assignArrLength}\" )"
            eval "$execute"
            paramNo+=$(expr $assignArrLength - 1)

            unset assignArrLength
        elif [[ "$assignVarType" == "params" ]]
        then
            execute="$assignVarName=( \"\${@:$previousParamNo}\" )"
            eval "$execute"
        elif [[ "$assignVarType" == "reference" ]]
        then
            execute="$assignVarName=\"\$$previousParamNo\""
            eval "$execute"
        elif [[ ! -z "${!previousParamNo}" ]]
        then
            execute="$assignVarName=\"\$$previousParamNo\""
            eval "$execute"
        fi
    fi

    assignVarType="$__capture_type"
    assignVarName="$varName"
    assignArrLength="$__capture_arrLength"
}

Function.CaptureParams() {
    __capture_type="$_type"
    __capture_arrLength="$l"
}

alias @trapAssign='Function.CaptureParams; trap "declare -i \"paramNo+=1\"; Function.AssignParamLocally \"\$BASH_COMMAND\" \"\$@\"; [[ \$assignNormalCodeStarted = true ]] && trap - DEBUG && unset assignVarType && unset assignVarName && unset assignNormalCodeStarted && unset paramNo" DEBUG; '
alias @param='@trapAssign local'
alias @reference='_type=reference @trapAssign local -n'
alias @var='_type=var @param'
alias @params='_type=params @param'
alias @array='_type=array @param'

1

허용 된 답변에 추가하기 만하면 배열 내용이 다음과 같은 경우 잘 작동하지 않습니다.

RUN_COMMANDS=(
  "command1 param1... paramN"
  "command2 param1... paramN"
)

이 경우 배열의 각 멤버가 분할되므로 함수에 표시되는 배열은 다음과 같습니다.

RUN_COMMANDS=(
    "command1"
    "param1"
     ...
    "command2"
    ...
)

이 사례를 작동 시키려면 변수 이름을 함수에 전달한 다음 eval을 사용하십시오.

function () {
    eval 'COMMANDS=( "${'"$1"'[@]}" )'
    for COMMAND in "${COMMANDS[@]}"; do
        echo $COMMAND
    done
}

function RUN_COMMANDS

그냥 내 2 ©


1

추악한 것처럼 배열을 명시 적으로 전달하지 않고 배열에 해당하는 변수를 사용하는 한 작동하는 해결 방법이 있습니다.

function passarray()
{
    eval array_internally=("$(echo '${'$1'[@]}')")
    # access array now via array_internally
    echo "${array_internally[@]}"
    #...
}

array=(0 1 2 3 4 5)
passarray array # echo's (0 1 2 3 4 5) as expected

누군가가 아이디어를보다 명확하게 구현할 수 있다고 확신하지만 배열을 "{array[@]"}다음으로 사용하여 내부에 액세스 하는 것보다 더 나은 솔루션이라는 것을 알았 습니다 array_inside=("$@"). 다른 위치 / getopts파라미터 가있는 경우 복잡해집니다 . 이 경우 먼저 조합 shift및 배열 요소 제거를 사용하여 배열과 관련되지 않은 매개 변수를 결정한 다음 제거해야했습니다 .

순수 주의적 관점은이 접근법이 언어를 위반 한 것으로 간주 할 수 있지만, 실용적으로 말하면,이 접근법은 저에게 많은 슬픔을 줄였습니다. 관련 주제에서, 함수에 전달한 eval매개 변수에 따라 명명 된 변수에 내부적으로 구성된 배열을 할당하는 데 사용 됩니다 target_varname.

eval $target_varname=$"(${array_inside[@]})"

이것이 누군가를 돕기를 바랍니다.


0

요구 사항 : 배열에서 문자열을 찾는 기능입니다.
이것은 전달 된 인수를 복사하지 않고 사용한다는 점에서 DevSolar 솔루션을 약간 단순화 한 것입니다.

myarray=('foobar' 'foxbat')

function isInArray() {
  local item=$1
  shift
  for one in $@; do
    if [ $one = $item ]; then
      return 0   # found
    fi
  done
  return 1       # not found
}

var='foobar'
if isInArray $var ${myarray[@]}; then
  echo "$var found in array"
else
  echo "$var not found in array"
fi 

0

내 대답은 :

function display_two_array {
    local arr1=$1
    local arr2=$2
    for i in $arr1
    do
       "arrary1: $i"
    done
    
    for i in $arr2
    do
       "arrary2: $i"
    done
}

test_array=(1 2 3 4 5)
test_array2=(7 8 9 10 11)

display_two_array "${test_array[*]}" "${test_array2[*]}"
것으로 나타났습니다해야 ${test_array[*]}하고는 ${test_array2[*]}, 그렇지 않으면 당신은 실패 할 것이다 ","로 묶어야한다.


불완전하여 예제가 잘못되었습니다. 전체 스크립트 코드를 제공하십시오.
Dennis VR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.