전달된 매개변수를 반복해야 하는 스크립트가 있습니다. 매개변수가 로 시작하는 경우 -
이를 문자열에 넣고 opts
에서 가져와야 합니다 $@
.
opts=""
for arg in "$@"
do
if [[ "$arg" == -* ]]; then
opts="${opts} ${arg}"
# remove arg from $@ ??
fi
done
echo $@
echo $args
arg
전달된 매개변수 배열에서 제거하는 방법은 무엇입니까 $@
?
답변1
never 로 시작하는 옵션이 -
인수를 취하지 않으면 다음을 사용하십시오.opts
대량으로:
for a; do
shift
case $a in
-*) opts+=("$a");;
*) set -- "$@" "$a";;
esac
done
(문자열로 만들고 싶다면 opts+=("$a")
로 변경하세요. 그러면 스니펫이 표준 셸에서 작동하게 됩니다.)opts="$opts$a "
opts
답변2
bash, ksh, zsh에서 확장하면 다음으로 시작하는 모든 매개변수가 지워집니다 -
.
echo "${@##-*}"
그렇지 않으니 참고하세요제거하다매개변수를 비워두기만 하면 됩니다.
-
그러나 공백과 줄 바꿈을 처리할 수 있으면서 시작하지 않는 매개변수 목록을 얻는 것은 상당히 어렵습니다.
간단한 루프를 사용하는 것이 더 좋습니다.
unset args opts;
for a; do
if [[ $a == [-]* ]]; then
opts+=("$a");
else
args+=("$a");
fi;
done;
printf '<%s> ' "${args[@]}"; echo;
printf '<%s> ' "${opts[@]}"; echo;