bash - 변수 int 값을 사용하여 함수의 위치 매개변수 참조

bash - 변수 int 값을 사용하여 함수의 위치 매개변수 참조

변수를 사용하고 싶습니다.

i=1

스크립트에 대한 참조로 전달된 위치 변수의 값입니다. 예:

x=101
y=201
z=301

foo(){
    echo "$1"
    echo "$2"
    echo "$3"
}

foo x y z

산출:

101
201
301

i인덱스별로 각 매개변수를 참조하는 대신 인덱스 변수를 사용하여 증가시키려면 어떻게 해야 합니까 ?

밝히다:

foo() {
    local i=1
    echo "$i" #echo first paramter
    (( i+=1 ))
    echo "$i" #echo second parameter
    #etc.
}

이 부분의 구문은 무엇입니까 echo "$i"?

@Eric 답변 후 업데이트됨

~$ t=5
~$ foo() { i=1; echo "${!i}"; }
~$ foo t
t
~$

업데이트 #2

간단히 말해서, 내 방법을 작동시킬 수 있는 유일한 방법은 다음과 같습니다.

foo() { #assuming 3 parameters

    i=0
    (( i+=1 ))
    var="${!i}"
    echo "${!var}"

    (( i+=1 ))
    var="${!i}"
    echo "${!var}"

    (( i+=1 ))
    var="${!i}"
    echo "${!var}"        
}

답변1

이것은 SO 질문과 유사합니다여기, 이는 @costas 댓글과 유사합니다. 다음을 사용하여 $#매개변수 수를 얻을 수 있습니다 .간접 참조${!i}이름으로 변수에 액세스하는 것과 같습니다. 예는 다음과 같습니다.

f() {
    for((i=1; i<=$#; i++)); do
        printf "%d %s\n" "$i" "${!i}"
    done
}

f a b c

인쇄:

1 a
2 b
3 c

이제 변수 이름을 위치 인수로 전달하려는 경우 다음과 같이 간접 참조 레이어를 추가할 수 있습니다.

a=first
b=second
c=third

f() {
    for((i=1; i<=$#; i++)); do
        var="${!i}"
        printf "%d %s\n" "$i" "${!var}"
    done
}

f a b c

인쇄

1 first
2 second
3 third

이를 통해 각 매개변수를 변수 이름으로 처리하고 거기에 저장할 수 있습니다 var. 그렇다면 우리는 printf

한 번에 한 수준의 간접 참조만 얻을 수 있으며 중첩은 효과가 없습니다. 그러므로 한번에 다 하려고 하면 ${!${!i}}처음부터 {확장이 시작되고 나머지는 확장되는 PARAMETER 값으로 처리되기 때문에 소용이 없습니다. 첫 번째 문자는 !나머지 문자를 우리가 원하는 매개변수 이름을 포함하는 PARAMETER 이름으로 처리하지만 ${!i}유효한 매개변수 이름은 아니므로 bad substitution단 두 단계만으로 이 문제를 피할 수 있습니다.

답변2

를 사용하면 shift다음을 수행할 수 있습니다.

num_args="$#"

for (( i = 1; i <= "$num_args"; i++ )); do
    echo "$1"
    shift
done

여기서 shift명령은변화스크립트에 전달된 인수의 각 다음 인수는 의 값입니다 $1.

예를 들어:

$ ./myscript one two three four five six
one
two
three
four
five
six

여기서 루프의 첫 번째 실행에서는 $1 = "one", 루프의 두 번째 실행에서는 , $1 = "two"마지막 인수까지 계속됩니다.


편집하다:순서 없이 스크립트 매개변수에 액세스하려는 경우. 두 번째와 네 번째 인수를 모두 사용하는 한 가지 방법은 다음과 같이 bash 배열을 사용하는 것입니다.

# Initialize the array 'myargs' with all script arguments
myargs=( "$@" )

for (( i = 0; i < "$#"; i++ )); do
    echo "${myargs[$i]}"
done

i여기에서 양식을 사용하여 지정된 인덱스가 있는 모든 매개변수에 액세스할 수 있습니다 "${myargs[$i]}".

관련 정보