Como pular o primeiro argumento em um script

0

O Guia de Bolso do Linux tem um bom exemplo de como examinar todos os argumentos em um script

for arg in $@
do
   echo "I found the argument $arg"
done

Estou escrevendo um script no qual todos os argumentos serão arquivos de texto, e eu concatenarei todos os arquivos de texto e os imprerei para stdout, no entanto, devo excluir o conteúdo do primeiro argumento. Minha primeira abordagem seria algo assim

for arg in $@
do
   cat "$arg"

done

No entanto, isso incluirá o primeiro argumento e, como mencionei, desejo imprimir todos, exceto o primeiro.

    
por Haz 18.09.2015 / 05:35

4 respostas

5

Você pode usar o comando shift da seguinte forma:

shift
for arg in "$@"
do
    cat "$arg"
done 
    
por 18.09.2015 / 05:42
1

Você pode usar o comando shift para alterar os argumentos, descartando o primeiro. Aqui está um exemplo:

arg1=$1
shift
for arg in "$@"; do
  cat "$arg"
done
    
por 18.09.2015 / 05:40
1

Você pode usar o deslocamento incorporado para descartar um ou mais parâmetros posicionais, mas você deve verificar o número de parâmetros primeiro:

if [ "$#" > 1 ]; then
  # Save first parameter value for using later
  arg1=$1
  shift
fi

Chamando shift sem qualquer argumento que signifique shift 1 .

Repetição de todos os argumentos posicionais:

for arg do
  : do something with "$arg"
done

No seu caso, você não precisa do loop, já que cat pode trabalhar com vários arquivos:

cat -- "$@"

Aqui está um teste para chamar shift quando não há argumentos posicionais:

$ for shell in /bin/*sh /opt/schily/bin/[jbo]sh; do
  printf '[%s]\n' "$shell"
  "$shell" -c 'shift'
done

Saída:

[/bin/ash]
/bin/ash: 1: shift: can't shift that many
[/bin/bash]
[/bin/csh]
shift: No more words.
[/bin/dash]
/bin/dash: 1: shift: can't shift that many
[/bin/ksh]
/bin/ksh: shift: (null): bad number
[/bin/lksh]
/bin/lksh: shift: nothing to shift
[/bin/mksh]
/bin/mksh: shift: nothing to shift
[/bin/pdksh]
/bin/pdksh: shift: nothing to shift
[/bin/posh]
/bin/posh: shift: nothing to shift
[/bin/sh]
/bin/sh: 1: shift: can't shift that many
[/bin/tcsh]
shift: No more words.
[/bin/zsh]
zsh:shift:1: shift count must be <= $#
[/opt/schily/bin/bsh]
shift: cannot shift.
[/opt/schily/bin/jsh]
/opt/schily/bin/jsh: cannot shift
[/opt/schily/bin/osh]
/opt/schily/bin/osh: cannot shift

Bem, bash é silencioso sem argumentos posicionais. Chamando com espaço reservado em $0 :

"$shell" -c 'shift' _

fez csh variants e schily bsh ficarem em silêncio também. Em caso de erro, zsh , csh variants e schily bsh não sairão do script não interativo depois de reportá-lo.

    
por 18.09.2015 / 06:30
0

Você pode usar o corte de matriz ${@:2} :

$ foo () { echo "The args are ${@:2}" ;}
$ foo spam egg bar
The args are egg bar
    
por 18.09.2015 / 05:41