Bash 배열에 대한 포함 함수 만들기

Bash 배열에 대한 포함 함수 만들기

배열에 특정 값이 있는지 확인하는 함수가 포함되어 있습니다. 배열 자체는 첫 번째 매개변수로 전달되고 값은 두 번째 매개변수로 전달됩니다.

#!/usr/bin/env bash

set -e;

branch_type="${1:-feature}";
arr=( 'feature', 'bugfix', 'release' );

contains() {
    local array="$1"
    local seeking="$2"
    echo "seeking => $seeking";
#    for v in "${!array}"; do
     for v in "${array[@]}"; do
        echo "v is $v";
        if [ "$v" == "$seeking" ]; then
         echo "v is seeking";
            return 0;
        fi
    done
   echo "returning with 1";
   return 1;
}

if ! contains "$arr" "$branch_type"; then
    echo "Branch type needs to be either 'feature', 'bugfix' or 'release'."
    echo "The branch type you passed was: $branch_type"
    exit 1;
fi

echo "all goode. branch type is $branch_type";

인수 없이 스크립트를 실행하면 기본값이 "feature"이므로 작동하지만 어떤 이유로 검색 결과가 일치하지 않습니다. 오류는 발생하지 않지만 포함 기능이 예상대로 작동하지 않습니다.

매개변수 없이 스크립트를 실행하면 다음과 같은 결과가 나타납니다.

seeking => feature
v is feature,
returning with 1
Branch type needs to be either 'feature', 'bugfix' or 'release'.
The branch type you passed was: feature

이제 이거 이상해

답변1

노트:Bash 4에서 작동하도록 이 문제를 해결하는 방법을 보여 드리겠습니다.


배열을 함수에 전달하는 방식이 잘못된 것 같습니다.

$ cat contains.bash
#!/usr/bin/env bash

branch_type="${1:-feature}";
arr=('feature' 'bugfix' 'release');

contains() {
    local array=$1
    local seeking="$2"
    for v in ${!array}; do
        if [ "$v" == "$seeking" ]; then
            return 0;
        fi
    done
   return 1;
}

if ! contains arr $branch_type; then
    echo "Branch type needs to be either 'feature', 'bugfix' or 'release'."
    echo "The branch type you passed was: $branch_type"
    exit 1;
fi

echo "the array contains: $branch_type";

나는 상황을 조금 바꾸었고 지금은 작동하는 것 같습니다.

$ ./contains.bash
the array contains: feature

다양성

원본 스크립트에서 두 가지만 변경했습니다. 다음 줄을 사용하여 배열의 기본 이름을 contains()전달하도록 함수가 호출되는 방식을 변경했습니다 .arr

if ! contains arr $branch_type; then

contains()그리고 전달된 매개변수로 배열을 설정하는 함수 내에서 다음 줄을 변경하여 지역 변수 설정에서 따옴표를 제거했습니다 array.

    local array=$1

인용하다

답변2

Bash3 관용구는 다음과 같습니다:

#!/usr/bin/env bash

set -e; 

branch_type="${1:-feature}";
arr=( 'feature' 'bugfix' 'release' );

contains() {

    local seeking="$1"
    shift 1;
    local arr=( "$@" )

    for v in "${arr[@]}"; do
        if [ "$v" == "$seeking" ]; then
            return 0;
        fi
    done
   return 1;
}

if ! contains "$branch_type" "${arr[@]}"; then
    echo "Branch type needs to be either 'feature', 'bugfix' or 'release'."
    echo "The branch type you passed was: $branch_type"
    exit 1;
fi

echo "the array contains: $branch_type";

진짜 끊김은 내가 이것을 하려고 할 때이다:

local seeking="$1"
local arr=( "$2" )

그러나 이것은 필요합니다:

local seeking="$1"
shift 1;
local arr=( "$@" )

관련 정보