매개변수 4..99를 다른 함수에 전달하는 방법

매개변수 4..99를 다른 함수에 전달하는 방법

함수를 호출하는데 최대 100개의 매개변수를 다른 함수에 전달하고 싶습니다. 나는 처음 3개의 매개변수를 전달하고 싶지 않습니다. 다른 프로그램의 첫 번째 매개변수로 param4로 시작합니다.

현재 최대 19개의 추가 패스를 허용합니다.

$function_under_test "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}" 
  "${13}" "${14}" "${15}" "${16}" "${17}" "${18}" "${19}"

그러나 이는 더 큰 매개변수 세트에 대해서는 그다지 신뢰할 수 없습니다.

나는 노력했다

  declare -a pass_on_params
  for ((a=2; a<$#; a++)); do
    pass_on_params+=(${@[a]})  # line 8
  done
  echo "->" $pass_on_params

하지만 난 이해해

do_test.sh: line 8: ${@[a]}: bad substitution

전체 코드는 다음과 같습니다.

do_test () {
  function_under_test=$1
  line_number=$2
  expected="$3"
  param1="$4"
  declare -a pass_on_params
  for ((a=2; a<$#; a++)); do
    pass_on_params+=(${@[a]})
  done
  echo "ppppppppp" $pass_on_params
  $function_under_test "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}" "${13}" "${14}" "${15}" "${16}" "${17}" "${18}" "${19}"
  if [ $result -eq $expected ]; then
    printf '.'
  else
    printf 'F'
    error_messages=$error_messages"Call to '$function_under_test $param1' failed: $result was not equal to $expected at line $line_number\n"
  fi
}

쉘은 bash입니다.

답변1

"${@:4}"bash에서 나를 위해 작동합니다. 다른 배열에 할당하고 해당 배열에 인덱스를 지정할 수도 있습니다.

foo=("$@")
second_function "${foo[@]:4}"

답변2

다른 기능을 사용하세요:

fn(){
    pass(){
        shift "$shift"
        "$other" "$@"
    }
    other=fn2 shift=3 pass "$@"
    unset -f pass
}

그러나 체계적인 방식으로 매개변수를 반복하는 것이 가장 좋습니다. 좋다...

while [ "$#" -gt 0 ]
do    : something with "$1"
shift;done

..또는..

for arg do : something with "$arg"; done

...하지만 당신이 무엇을 하고 있는지 말하기는 어렵습니다.

eval참조를 올바르게 처리하면 수학 표현식을 위치 인수로 안전하게 변환할 수 있습니다.

eval "fn2 $(i=3
    until [ "$#" -le 3 ]
    do    printf '"${%d}" ' "$((i+=1))"
    shift;done
)"

답변3

3번 이동하고 $@를 통과하고 싶습니다.

전체 코드는 다음과 같습니다.

do_test () {
  function_under_test=$1;shift
  line_number=$1;shift
  expected="$1";shift
  echo "ppppppppp" $@
  $function_under_test "$@"
  if [ $result -eq $expected ]; then
    printf '.'
  else
    printf 'F'
    error_messages=$error_messages"Call to '$function_under_test $param1' failed: $result was not equal to $expected at line $line_number\n"
  fi
}

관련 정보