$ @에서 위치 매개 변수를 제거하는 방법


13

기본적으로 -inf매개 변수 목록에서 첫 번째 항목을 "추출"하고 싶습니다 . (나머지 매개 변수는 다른 명령으로 전달됩니다.)

내가 가지고있는 스크립트는 다음과 같은 구조를 가지고 있습니다 :

#!/bin/sh

<CODE>

for POSITIONAL_PARAM in "$@"
do

    <CODE>

    if [ "$POSITIONAL_PARAM" = '-inf' ]
    then
        <PLUCK $POSITIONAL_PARAM FROM $@>
        break
    fi

    <CODE>

done

<CODE>

some-other-command "$@"

# end of script

이를 수행하는 좋은 방법이 있습니까?

BTW는에 적용되는 답변에 주로 관심이 있지만에 적용 /bin/sh되는 답변에만 관심이 /bin/bash있습니다.


@cuonglm : 나는 의사 코드의 원래 형태로 되돌아 갔다. 내 경험상 그림을 너무 단순화 할 때마다 지나치게 단순화 된 경우에는 효과가 있지만 실제로는 그렇지 않습니다.
kjo

답변:


20

POSIXly :

for arg do
  shift
  [ "$arg" = "-inf" ] && continue
  set -- "$@" "$arg"
done

printf '%s\n' "$@"

위의 코드는 심지어 원래 Almquist 쉘 (읽기를 제외하고, 사전 POSIX 쉘에서 작동 미주 ). for루프를 다음과 같이 변경하십시오 .

for arg
do
  ...
done

모든 포탄에서 작동하도록 보장하십시오.


다른 POSIX 것 :

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done

이것으로 첫 번째 제거 할 필요 (에서 (pattern)이 전 POSIX 쉘에서 작동하도록합니다.


감사. 그 주장 순환 기술은 매우 좋습니다. 추가 된 보너스가있어 현재 매개 변수를 따르는 매개 변수를 매우 쉽게 검사 할 수 있습니다 (바로 거기에 있기 때문에 $1). 이 속성은 내가하고있는 일에 유용했습니다. 또한 루프 in "$@"; 상단의 비트 for가 필요하지 않음을 상기시켜 주셔서 감사합니다 . 그것은 전에 본 적이 있지만 잊어 버리는 경향이 있습니다. 의 Almquist 쉘에 대한 당신의 발언에 대해서는하면는 않습니다 do 다음 줄에 표시, 또는 것 for arg; do너무 일을?
kjo

1
for arg; doAlmquist shell에서 작업
cuonglm

3
시작되지 않은 사람들 for arg do을위한 속기 관용구입니다 for arg in "$@"; do. 그것은 약 5 초 동안 나를 던졌다! 어떤 사람들은 후자가 더 읽기
쉽다고

0

비슷한 문제를 해결하려고 노력 하면서이 질문을 찾았지만 모든 비 옵션 인수 (로 시작하지 않는 인수 -)를 수신 된 --구분 기호 까지 처리하려고했습니다 . 처리 된 인수 만 뽑고 나머지는 제공된 순서대로 그대로두고 싶었습니다.

여기에 내가 생각해 낸 것이 있습니다.

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.