Loop no WildCard como entrada de script

3

Eu quero usar meu script em vários arquivos, às vezes.

Eu usei isso para o propósito:

for etminput in $1
do
    #process
done

Mas isso apenas dá a primeira entrada. Como posso fazer o processo em todas as correspondências curinga?

    
por Mohammad Etemaddar 27.08.2014 / 21:53

2 respostas

9

Se você quiser fazer um loop sobre todos os argumentos para o seu script, em qualquer shell parecido com o Bourne, é:

for i do
  something with "$i"
done

Você também pode fazer:

for i in "$@"; do
  something with "$i"
done

mas é mais longo e não tão portátil (embora seja para os shells modernos).

Observe que:

for i; do
  something with "$i"
done

não é nem Bourne nem POSIX, portanto deve ser evitado (embora funcione em muitos shells)

Para completar, em cartuchos não-Bourne:

csh / tcsh

@ i = 1
while ($i <= $#argv)
  something with $argv[$i]:q
  @ i++
end

Você não pode usar:

foreach i ($argv:q)
  something with $i:q
end

porque isso pula os argumentos vazios

rc / akanga

for (i) something with $i

( rc geralmente é o que as shells devem ser).

es

for (i=$*) something with $i

(é rc em esteróides).

peixe

for i in $argv
  something with $i
end

zsh

Embora aceite a sintaxe Bourne, também suporta os mais curtos como:

for i ("$@") something with "$i"
    
por 27.08.2014 / 22:10
0
#!/bin/bash

n=1
echo "$0 got $# args..."
while [ $# -gt 0 ] ;do
  echo "$n: $1"
  shift
  n=$(( $n + 1 ))
done

Como alternativa, procure "Listando argumentos com $ * e $ @ '

em link
que irá elaborar muitos aspectos destes.

    
por 27.08.2014 / 22:10