함수를 호출하는데 최대 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
}