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

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

-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

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

그건 그렇고, 나는 주로 에 적용되는 답변에 관심이 있지만 /bin/sh에만 적용되는 답변에도 관심이 있습니다 /bin/bash.

답변1

POSIX적으로:

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

이 경우 POSIX 이전 셸에서 작동하려면 (첫 번째 항목을 제거해야 합니다 .(pattern)

답변2

-유사한 문제를 해결하려고 시도하는 동안 이것을 발견했지만 옵션이 아닌 모든 매개변수( 로 시작하지 않는 매개변수 )를 수신된 구분 기호까지 모두 처리하고 싶었습니다 --. 처리된 매개변수를 꺼내고 나머지 매개변수는 제공된 순서대로 그대로 두려고 합니다.

이것이 내가 생각해 낸 것입니다.

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done

관련 정보