Como remover um parâmetro posicional de $ @

9

Basicamente, eu quero "arrancar" a primeira ocorrência de -inf da lista de parâmetros. (Os parâmetros restantes serão passados para um comando diferente).

O script que tenho tem a seguinte estrutura:

#!/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

Existe uma boa maneira de fazer isso?

BTW, embora eu esteja interessado principalmente em respostas aplicáveis a /bin/sh , também estou interessado em respostas aplicáveis somente a /bin/bash .

    
por kjo 29.01.2016 / 13:22

2 respostas

13

POSIXly:

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

printf '%s\n' "$@"

O código acima funciona até em shells pré-POSIX, exceto o shell original Almquist (Leia Endnote ). Altere o loop for para:

for arg
do
  ...
done

garanta o trabalho em todas as conchas.

Outro POSIX 1:

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

Com este, você precisa remover o primeiro ( em (pattern) para fazê-lo funcionar em shells pré-POSIX.

    
por 29.01.2016 / 13:31
0

Eu encontrei essa pergunta enquanto tentava resolver um problema semelhante, no entanto, queria processar todos os argumentos que não fossem de opção (aqueles que não começavam com - ) até qualquer separador -- recebido. Eu queria extrair apenas os argumentos processados e deixar os restantes in situ na ordem fornecida.

Aqui está o que eu criei.

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