옵션인 경우 $@에서 매개변수를 제거하세요.

옵션인 경우 $@에서 매개변수를 제거하세요.

전달된 매개변수를 반복해야 하는 스크립트가 있습니다. 매개변수가 로 시작하는 경우 -이를 문자열에 넣고 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;

관련 정보