Faz loop através de arquivos * usando $ 1 no script bash

1

Estou escrevendo um script para agir em arquivos fornecidos ao script usando a variável $ 1. Qual é a melhor maneira de percorrer esses arquivos. No momento, codifiquei o script usando algo como

for file in *.pdf
do 
   act on $file
done

No entanto, eu prefiro fazer isso usando a variável $ 1 obrigado Barry

    
por Barry Williams Bazzawill 09.08.2015 / 13:52

2 respostas

4

$1 é simplesmente o primeiro parâmetro passado para o seu script de shell. Então, se você tem um script myscript e eu chamo assim:

myscript somefile

Em seguida, $1 será somefile . Se eu chamo assim:

myscript *

E existem arquivos no meu diretório atual:

foo bar baz

Em seguida, $1 será foo . Em ambos os casos, $1 tem apenas um único valor e não há nada para fazer o loop.

Existem algumas maneiras de repetir os argumentos. O mais comum é:

for file in "$@"; do
  echo doing something with "$file"
done

Observe que $@ não é o mesmo que "$@" ; o último é uma construção especial que lidará corretamente com nomes de arquivos que contenham espaços. Você também pode fazer algo como:

while [ -n "$1" ]; do
  echo doing something with "$1"
  shift
done

Aqui, o comando shift descarta o primeiro parâmetro e $2 se torna $1 (e assim por diante). Isso fará um loop, contanto que $1 não esteja vazio. Você também pode usar $# para isso (uma variável que contém o número de argumentos da linha de comando):

while [ $# -gt 0 ]; do
    echo arg: "$1"
    shift
done
    
por 09.08.2015 / 14:47
1

Se você fizer

script *.pdf

*.pdf já está expandido na linha de comando e $1 se referirá apenas ao primeiro arquivo

for file in $1
Portanto, o

não fará o que você precisa. Você poderia usar

for file in "$@"

em vez disso.

Veja a seção Parâmetros especiais no man bash

    
por 09.08.2015 / 14:43