processam curingas em scripts bash

4

Eu só preciso de um exemplo simples de um script bash para processar um único arquivo ou vários arquivos se o caractere curinga for passado como argumentos

se eu correr

myscript file1

faça algo com o arquivo e, se eu emitir

myscript *.pdf

faça algo com critérios de correspondência de arquivos

Alguém pode dar um exemplo simples?

    
por opensas 17.05.2017 / 07:00

2 respostas

9

O *.pdf será expandido pelo shell antes de executar o script, portanto, o script não verá *.pdf , ele verá os nomes dos arquivos correspondentes diretamente:

$ cat foo.sh
#! /bin/sh

printf "|%s|\n" "$@"
$ touch {1..10}.pdf
$ ./foo.sh 1.pdf
|1.pdf|
$ ./foo.sh *.pdf
|1.pdf|
|10.pdf|
|2.pdf|
|3.pdf|
|4.pdf|
|5.pdf|
|6.pdf|
|7.pdf|
|8.pdf|
|9.pdf|

Dentro de um script bash, você pode usar "$@" para obter todos os argumentos passados para ele, ou usar , , etc. para acessar diretamente o primeiro, segundo, etc. argumento.

Você pode passar o loop por todos os argumentos com um for :

for i     # Or, for i in "$@"
do
    echo "Processing argument $i"
done

A saída será:

Processing argument 1.pdf
Processing argument 10.pdf
Processing argument 2.pdf
Processing argument 3.pdf
Processing argument 4.pdf
Processing argument 5.pdf
Processing argument 6.pdf
Processing argument 7.pdf
Processing argument 8.pdf
Processing argument 9.pdf
    
por muru 17.05.2017 / 07:06
3

Aqui está uma leitura no (s) seu (s) arquivo (s) como um array, permitindo que você trabalhe com ele da seguinte forma:

#!/bin/bash

filearray=( "$@" )

if [ ${#filearray[@]} -gt "1" ] || [ ${#filearray[@]} == "0" ]; then
    isare=are
    ent=entries
else
    isare=is
    ent=entry
fi

echo "There $isare ${#filearray[@]} $ent."
echo ""
if [ ${#filearray[@]} == "0" ]; then
    echo "Nothing entered."
    exit
else
    echo "This is what you entered or what was found: "
    echo ""
    printf '%s\n' "${filearray[@]}"
fi

Usar o "" para o array faz com que ele leia os arquivos mesmo que tenham espaços e não os separe ao imprimir. Também adicionei alterações de texto com base no número de arquivos encontrados. Nenhuma entrada mostrará 0. O ${#filearray[@]} conta o número de elementos, onde ${filearray[@]} mostrará todos os elementos.

Exemplos:

Uma entrada:

$ ./myscript myfile.txt
There is 1 entry.

This is what you entered or what was found: 

myfile.txt

Várias entradas:

$ ./myscript *.sh
There are 5 entries.

This is what you entered or what was found: 

blue-ray_encode.sh
lightsOn.sh
removeoffender.sh
test1.sh
test.sh

Nenhuma entrada:

$ ./myscript 
There are 0 entries.

Nothing entered.
    
por Terrance 17.05.2017 / 07:36

Tags