Intereting Posts

Как передать параметры 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 } 

Оболочка

"${@:4}" работает для меня в bash. Вы также можете назначить другому массиву и индексировать его:

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

Просто используйте другую функцию:

 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 "fn2 $(i=3 until [ "$#" -le 3 ] do printf '"${%d}" ' "$((i+=1))" shift;done )" 

Вы хотите переместить три раза и передать $ @

Полный код:

 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 }