Como você verifica se todos os argumentos passados para um script de shell são arquivos? Tentei usar o $@
parâmetro e -f
com uma if
instruçã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.