Use o teste do shell para validar as informações básicas do arquivo. [duplicado]

1
    

Esta pergunta já tem uma resposta aqui:

    

Estou tentando escrever um script Bash que usa o nome de um arquivo ou diretório como um argumento e relata se o arquivo é um diretório, um arquivo regular ou outro. O script também deve relatar se o usuário tiver lido, escrito e executado a permissão no arquivo ou diretório.

Obviamente, algo assim receberá as informações brutas:

#!/bin/sh
read -p "Enter a filename: " fname
file $fname
ls -la $fname

no entanto, eu estou querendo saber se poderíamos simplesmente soltar o comando file completamente, passar a variável filename para um ls que nós então escrevemos algum tipo de declaração if, then, else baseada nos resultados. o comando ls fornece um tipo de arquivo e quebra completa das permissões que o usuário que está executando no arquivo, portanto, posso fazer uma saída personalizada com base nos resultados de um comando ls?

Em vez disso, o teste de shell é recomendado. A resposta abaixo mostra um ótimo exemplo de como formatar isso.

    
por DanMan3395 05.07.2018 / 21:54

1 resposta

1

Você pode usar o teste de shell para verificar o tipo de arquivo e as permissões:

#!/bin/sh

read -rp 'Enter a filename: ' fname
if [ -f "$fname" ]; then
    echo 'File is a regular file'
elif [ -d "$fname" ]; then
    echo 'File is a directory'
else
    echo 'File is not a regular file or a directory'
fi
[ -r "$fname" ] && read=read
[ -w "$fname" ] && write=write
[ -x "$fname" ] && execute=execute

echo "User has ${read} ${write} ${execute} permissions" | tr -s ' '

O teste de shell

A construção if informará sobre o tipo de arquivo, verificando se é um arquivo normal ( -f ) ou um diretório ( -d ), caso contrário, informará que não é nenhum dos dois.

Em seguida, verificamos as várias permissões: read ( -r ), write ( -w ) e execute ( -x ). Definindo uma variável para cada um. Se o usuário não tiver uma dessas permissões, a variável correspondente permanecerá indefinida, portanto, na linha de eco final, se o usuário não tiver essa permissão, a variável será expandida para nada. Isso é encerrado com uma chamada para tr -s ' ' para remover quaisquer espaços extras que possam estar lá de permissões não existentes.

    
por 05.07.2018 / 22:02