Como posso passar os parâmetros 4..99 para outra função

2

Estou chamando uma função e quero passar até 100 parâmetros para outra função. Eu não quero passar os 3 primeiros parâmetros, eu começo com o param4 sendo o primeiro parâmetro para o outro programa.

Atualmente estou autorizando a transmissão de até 19 adicionais com

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

mas isso não é muito substanável para conjuntos maiores de parâmetros.

Eu tentei

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

mas eu recebo

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

O código completo é:

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
}

O shell é bash

    
por Michael Durrant 08.02.2015 / 17:09

3 respostas

6

"${@:4}" funciona para mim no bash. Você também pode atribuir a outra matriz e indexá-la:

foo=("$@")
second_function "${foo[@]:4}"
    
por 08.02.2015 / 17:29
3

Use apenas outra função:

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

Seria melhor, no entanto, iterar os argumentos de uma forma organizada. Como ...

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

.. ou ..

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

... mas é difícil dizer o que você está fazendo.

Você pode com segurança eval uate expressões matemáticas em parâmetros posicionais se você manipular o direito de citar:

eval "fn2 $(i=3
    until [ "$#" -le 3 ]
    do    printf '"${%d}" ' "$((i+=1))"
    shift;done
)"
    
por 08.02.2015 / 17:41
2

Você quer mudar três vezes e passar $ @

O código completo é:

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
}
    
por 08.02.2015 / 17:17