함수에 전달 된 배열을 이름으로 할당하는 방법

셀러리

배열을 반복하고 아직 포함되지 않은 경우 주어진 값을 삽입하는 함수를 만들고 싶습니다. 이 함수를 코드의 두 부분에서 사용하고 있으므로 다른 배열을 사용해야합니다. 따라서 함수에 배열 이름을 전달하고 있습니다. 이제이 위치에 요소를 저장하기 위해 배열의 슬롯을 할당하는 방법을 알 수 없습니다.

내 코드는 다음과 같습니다.

name=("hello" "world")

function f {
    array_name=$2[@]
    array=("${!array_name}")
    length=${#array_name[@]}
    for (( i = 0; i <= $length; i++ )); do
        if [[ "${array[i]}" = "$1" ]];
            break;
        fi
        if [[ "$i" = "$length" ]]; then
            ${2[$length+1]=$1};
        fi
    done
}

f "test" "name"

편집 : 배열이 주어진 값을 추가하기를 원합니다.

for i in ${name[@]}
do
    echo $i
done

이 출력은 다음과 같습니다.

hello
world
test

그러나 분명히 "${2[$length+1]=$1}"작동하지 않습니다.

(배열 전달에 대한 아이디어는 여기에서 : 배열을 함수에 인수로 전달하는 방법 bash )

gniourf_gniourf

이 값이 아직 배열에 없으면 배열에 값을 추가하고 싶지만 배열 이름 이 함수에 전달 된다는 것을 올바르게 이해하면 배열에 값을 추가하고 싶습니다 .

방법 1

한 가지 가능성은 다른 관점에서 문제를 보는 것입니다. 삽입 할 값과 전체 배열을 함수에 전달할 수 있으며, 함수는 실행 후 복구 할 전역 변수를 설정합니다. 테스트 예에서는 다음을 사용합니다.

array=( hello world "how are you today?" )

우리는 삽입하려고합니다 testhello(수 있도록 hello삽입되지 않습니다)를 :

f() {
# This function will set the global variable _f_out to an array obtained from
# the positional parameters starting from position 2, with $1 appended if and
# only if $1 doesn't appear in the subsequent positional parameters
    local v=$1 i
    shift
    _f_out=( "$@" )
    for i; do [[ $i = $v ]] && return; done
    _f_out+=( "$v" )
}

그것을 사용합시다 :

$ array=( hello world "how are you today?" )
$ f test "${array[@]}"
$ array=( "${_f_out[@]}" )
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test
$ f hello "${array[@]}"
$ array=( "${_f_out[@]}" )
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test

효과가있다.

말. 나는 for i; do. 에 대한 좋은 바로 가기입니다 for i in "$@"; do.

방법 2

당신은 정말로 유사 포인터를 가지고 다니고 제자리에 추가를하고 싶어합니다. (이것은 실제로 Bash의 정신이 아니기 때문에 약간 서투른 것입니다). 이를위한 도구는 printf다음 -v옵션 과 함께 사용 하는 것입니다. from help printf:

-v var    assign the output to shell variable VAR rather than
          display it on the standard output

좋은 점은 배열 필드에서도 작동한다는 것입니다.

경고 : eval. 전염병처럼 그들을 피하십시오!

f() {
    local array_name=$2[@] i
    local array=( "${!array_name}" )
    for i in "${array[@]}"; do [[ $i = $1 ]] && return; done
    # $1 was not found in array, so let's append it
    printf -v "$2[${#array[@]}]" '%s' "$1"
}

시도해 보겠습니다.

$ array=( hello world "how are you today?" )
$ f test array
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test
$ f hello array
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test

그것도 작동합니다.

노트. 두 방법 모두 return함수 코드를 매우 쉽게 가질 수 있습니다. 예를 들어 0값이 삽입 된 경우 (성공) 1, 값이 이미 존재하는 경우 (또는 그 반대의 경우) (실패)-적응은 간단하며 다음과 같이 남아 있습니다. 운동. 이는 array반환 된 값 으로 업데이트해야하는지 여부를 결정하는 방법 1에서 유용 할 수 있습니다 _f_out. 이 경우 값이 이미 배열에있을 때 f설정되지 않도록 약간만 수정할 수도 있습니다 _f_out.

경고. 표시된 두 방법 모두에서 배열에 0에서 시작하는 연속 인덱스가 있다고 가정했습니다 (예 : 비 희소 배열). 여기에서 안전한 가정이라고 생각합니다. 그러나 그렇지 않은 경우 이러한 메서드는 손상됩니다. 첫 번째 메서드는 (재 할당 후) 배열을 희소하지 않은 것으로 변환하고 두 번째 메서드는 필드를 덮어 쓸 수 있습니다 (배열의 a경우 ${#a[@]}다음 개수로 확장 됨). 배열에서 발견 된 가장 높은 인덱스 + 1이 아닌 배열의 요소).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

함수에서 사용되는 배열을 동적으로 할당 된 main 배열에 전달하는 방법은 무엇입니까?

분류에서Dev

함수에서 함수로 배열을 전달하는 방법

분류에서Dev

구조체 배열에 메모리를 할당 한 다음 해당 배열을 함수에 전달하여 C로 배열을 채우는 방법

분류에서Dev

함수에 전달 된 2D 배열을 수정하는 방법

분류에서Dev

동적으로 할당 된 3D 배열을 함수에 전달 (C ++)

분류에서Dev

함수에서 메인으로 문자열 배열을 전달하는 방법

분류에서Dev

함수에 전달 된 배열 요소의 값을 비교하는 방법

분류에서Dev

열에 할당 된 이름으로 데이터를 정렬하는 방법

분류에서Dev

함수에서 다른 함수로 동적으로 할당 된 배열 전달

분류에서Dev

plpgsql 함수에 매개 변수로 전달 된 열 이름으로 쿼리를 실행하는 방법은 무엇입니까?

분류에서Dev

함수에서 문자열을 인수로 전달할 때 열 이름을 유지하는 방법

분류에서Dev

생성자에 전달 된 여러 인수의 할당을 피하는 방법

분류에서Dev

생성자에 전달 된 배열을 사용하는 방법

분류에서Dev

구조체 배열을 C ++로 함수에 전달하는 방법

분류에서Dev

참조 C ++로 함수에서 동적 배열을 전달하는 방법

분류에서Dev

C ++ 함수에 대한 참조로 배열을 전달하는 방법

분류에서Dev

C 포인터, 배열을 함수에 전달하는 방법 이해

분류에서Dev

bash 함수 매개 변수로 전달 된 이름으로 배열에 추가

분류에서Dev

변수 매개 변수를 사용하여 함수에 전달 된 배열을 병합하는 방법

분류에서Dev

전달 된 함수를 호출하는 방법 (함수에 인수로 전달 된 함수 ptr)

분류에서Dev

매개 변수 이름을 함수에 인수로 전달하는 방법

분류에서Dev

함수에 전달 된 여러 인수 (...)의 이름을 캡처하는 방법은 무엇입니까?

분류에서Dev

매개 변수로 삽입하기 위해 객체 모델 (객체 모델 배열이 포함 된)을 API에 전달하는 방법

분류에서Dev

생성자에 전달 된 배열을 사용하여 배열에 값을 할당하는 방법은 무엇입니까?

분류에서Dev

VBscript에서 Delphi COM 서버 앱으로 전달 된 배열을 해석하는 방법

분류에서Dev

반환 된 값을 다른 함수에 전달하는 방법

분류에서Dev

Pygame에서 이미지를 가져 와서 정의 된 함수로 다른 이름을 할당하는 방법

분류에서Dev

함수에서 종속 함수로 배열로 전달하는 방법

분류에서Dev

매크로 함수에 문자열을 전달하는 방법

Related 관련 기사

  1. 1

    함수에서 사용되는 배열을 동적으로 할당 된 main 배열에 전달하는 방법은 무엇입니까?

  2. 2

    함수에서 함수로 배열을 전달하는 방법

  3. 3

    구조체 배열에 메모리를 할당 한 다음 해당 배열을 함수에 전달하여 C로 배열을 채우는 방법

  4. 4

    함수에 전달 된 2D 배열을 수정하는 방법

  5. 5

    동적으로 할당 된 3D 배열을 함수에 전달 (C ++)

  6. 6

    함수에서 메인으로 문자열 배열을 전달하는 방법

  7. 7

    함수에 전달 된 배열 요소의 값을 비교하는 방법

  8. 8

    열에 할당 된 이름으로 데이터를 정렬하는 방법

  9. 9

    함수에서 다른 함수로 동적으로 할당 된 배열 전달

  10. 10

    plpgsql 함수에 매개 변수로 전달 된 열 이름으로 쿼리를 실행하는 방법은 무엇입니까?

  11. 11

    함수에서 문자열을 인수로 전달할 때 열 이름을 유지하는 방법

  12. 12

    생성자에 전달 된 여러 인수의 할당을 피하는 방법

  13. 13

    생성자에 전달 된 배열을 사용하는 방법

  14. 14

    구조체 배열을 C ++로 함수에 전달하는 방법

  15. 15

    참조 C ++로 함수에서 동적 배열을 전달하는 방법

  16. 16

    C ++ 함수에 대한 참조로 배열을 전달하는 방법

  17. 17

    C 포인터, 배열을 함수에 전달하는 방법 이해

  18. 18

    bash 함수 매개 변수로 전달 된 이름으로 배열에 추가

  19. 19

    변수 매개 변수를 사용하여 함수에 전달 된 배열을 병합하는 방법

  20. 20

    전달 된 함수를 호출하는 방법 (함수에 인수로 전달 된 함수 ptr)

  21. 21

    매개 변수 이름을 함수에 인수로 전달하는 방법

  22. 22

    함수에 전달 된 여러 인수 (...)의 이름을 캡처하는 방법은 무엇입니까?

  23. 23

    매개 변수로 삽입하기 위해 객체 모델 (객체 모델 배열이 포함 된)을 API에 전달하는 방법

  24. 24

    생성자에 전달 된 배열을 사용하여 배열에 값을 할당하는 방법은 무엇입니까?

  25. 25

    VBscript에서 Delphi COM 서버 앱으로 전달 된 배열을 해석하는 방법

  26. 26

    반환 된 값을 다른 함수에 전달하는 방법

  27. 27

    Pygame에서 이미지를 가져 와서 정의 된 함수로 다른 이름을 할당하는 방법

  28. 28

    함수에서 종속 함수로 배열로 전달하는 방법

  29. 29

    매크로 함수에 문자열을 전달하는 방법

뜨겁다태그

보관