Como verificar se todos os argumentos são arquivos?

Como verificar se todos os argumentos são arquivos?

Como você verifica se todos os argumentos passados ​​para um script de shell são arquivos? Tentei usar o $@parâmetro e -fcom uma ifinstrução.

Responder1

Para testar setodosargumentos são arquivos, é mais fácil testar se um dos argumentos énãoum arquivo:

for argument do
    if [ ! -f "$argument" ]; then
        printf 'Not a file: %s\n' "$argument" >&2
        exit 1
    fi
done

echo 'All arguments are files'

Isso itera sobre todos os parâmetros posicionais e testa cada um deles. Se um arquivo não for encontrado, um erro será impresso e o código será encerrado.

Para investigar todos os argumentos:

for argument do
    if [ -f "$argument" ]; then
        printf 'Is a file: %s\n' "$argument"
    else
        printf 'Is not a file: %s\n' "$argument"
    fi
done

Isso itera sobre todos os parâmetros posicionais e testa cada um deles, imprimindo o resultado do teste.

Observe que "é um arquivo"na verdadesignifica "é um arquivo normal ou um link simbólico para um arquivo normal". Se você quiser ter certeza de que não é um link simbólico para um arquivo normal, use

if [ ! -f "$argument" ] || [ -L "$argument" ]; then

como o teste no primeiro loop, ou

if [ -f "$argument" ] && [ ! -L "$argument" ]; then

como o teste no segundo loop.

A primeira linha do loop também pode ser escrita

for argument in "$@"; do

... mas as pessoas tendem a esquecer de colocar aspas duplas $@e o loop na parte superior é mais curto para digitar de qualquer maneira.

informação relacionada