[ad_1]
Se um script Linux Bash depende da presença de certos arquivos ou diretórios, você não pode simplesmente presumir que sim. Você precisa verificar se eles estão definitivamente presentes. É assim que se faz.
não suponha nada
Ao escrever um script, você não pode fazer suposições sobre o que está e o que não está presente em um computador. Isso é duplamente verdadeiro se o script for distribuído e executado em muitos computadores diferentes. Mais cedo ou mais tarde, o script será executado em um computador que não atende às suas suposições e falhará ou será executado de forma imprevisível.
Tudo o que valorizamos ou criamos em um computador é armazenado em um arquivo de algum formato, e todos esses arquivos residem em um diretório. Os scripts podem ler, escrever, renomear, excluir e mover arquivos e diretórios, tudo o que você pode fazer na linha de comando.
A vantagem que você tem como ser humano é que você pode ver o conteúdo de um diretório e saber se um arquivo existe ou não, ou mesmo se o diretório esperado existe. Se um script falhar ao manipular arquivos, pode ter resultados sérios e prejudiciais.
O Bash fornece um conjunto abrangente de testes que você pode usar para detectar arquivos e diretórios e testar muitos de seus atributos. É fácil criá-los, mas os benefícios em termos de robustez e controle refinado são consideráveis.
RELACIONADO: Como usar testes condicionais de colchetes duplos no Linux
A gama de testes
Ao combinar a instrução if com o teste apropriado de uma grande coleção de testes de arquivos e diretórios, podemos determinar facilmente se um arquivo existe, é executável ou gravável e muito mais.
- -b: Retorna verdadeiro se o arquivo for um arquivo especial de bloco.
- -C: Retorna verdadeiro se o arquivo for um caractere especial.
- -d: Retorna verdadeiro se “arquivo” for um diretório.
- -Y: Retorna verdadeiro se o arquivo existir.
- -F: Retorna verdadeiro se o arquivo existir e for um arquivo normal.
- -grama: Retorna verdadeiro se o arquivo tiver a
setgid
conjunto de permissões (chmod g+
). - -h: Retorna verdadeiro se o arquivo for um link simbólico.
- -EU: Retorna verdadeiro se o arquivo for um link simbólico.
- -k: Retorna true se tiver seu sticky bit definido (
chmod +t
). - -p: Retorna true se o arquivo for um pipe nomeado.
- -r: Retorna verdadeiro se o arquivo for legível.
- -s: Retorna true se os arquivos existirem S Não está vazio.
- -S: Retorna verdadeiro se o arquivo for um soquete.
- -t: Retorna verdadeiro se o descritor de arquivo for aberto em um terminal.
- -sua: Retorna verdadeiro se o arquivo tiver a
setuid
conjunto de permissões (chmod u+
). - -W: Retorna verdadeiro se o arquivo pode ser gravado.
- -X: Retorna verdadeiro se o arquivo for executável.
- -QUALQUER: Retorna verdadeiro se for de sua propriedade.
- -GRAMA: Retorna verdadeiro se pertencer ao seu grupo.
- -NORTE: Retorna verdadeiro se o arquivo foi modificado desde a última vez que foi lido.
- !: O operador lógico NOT.
- &&: O operador lógico AND.
- ||: O operador lógico OR.
A lista começa com -b
porque ele -a
O teste foi descontinuado e substituído pelo -e
Teste.
RELACIONADO: Como usar SUID, SGID e Sticky Bits no Linux
Usando testes em scripts
O teste de arquivo genérico if
instrução é uma construção de script simples. A comparação dentro dos colchetes duplos” [[ ]]
“Use o -f
teste para determinar se existe um arquivo regular com esse nome.
Copie o texto deste script em um editor e salve-o em um arquivo chamado “script1.sh”, e use chmod
para torná-lo executável.
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 cannot be found." fi
Você precisa passar o nome do arquivo para o script na linha de comando.
chmod +x script1.sh
Você precisará fazer isso com cada script se quiser experimentar os outros exemplos do artigo.
Vamos testar o script em um arquivo de texto simples.
./script1.sh test-file.txt
O arquivo existe e o script relata corretamente esse fato. Se excluirmos o arquivo e tentarmos novamente, o teste falhará e o script o reportará.
./script1.sh test-file.txt
Em uma situação da vida real, seu script precisaria tomar qualquer ação apropriada. Talvez marque o erro e pare. Talvez crie o arquivo e continue. Você pode copiar algo de um diretório de backup para substituir o arquivo ausente. Tudo depende do objetivo do roteiro. Mas pelo menos agora o script pode tomar a decisão com base na presença ou não do arquivo.
a -f
flag verifica se o arquivo está presente e se é um arquivo “regular”. Em outras palavras, não é algo que parece ser um arquivo, mas não é, como um arquivo de dispositivo.
Usaremos ls para verificar se o arquivo “/dev/random” existe, e então veremos o que o script faz com ele.
ls -lh /dev/random
./script /dev/random
Como nosso script está testando arquivos normais e “/dev/random” é um arquivo de dispositivo, o teste falha. Muitas vezes, para saber se um arquivo existe, você precisa escolher cuidadosamente qual teste usar ou usar vários testes.
Este é o “script2.sh”, que procura por arquivos normais e arquivos de dispositivos de caracteres.
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 is missing or not a regular file." fi if [[ -c $1 ]] then echo "The file $1 is a character device file." else echo "The file $1 is missing or not a special file." fi
Se executarmos esse script no arquivo de dispositivo “/dev/random”, o primeiro teste falhará, o que esperávamos, e o segundo teste será bem-sucedido. Ele reconhece o arquivo como um arquivo de dispositivo.
./script2.sh /dev/random
Na verdade, ele o reconhece como um personagem arquivo do dispositivo. Alguns arquivos de dispositivo são arquivos de dispositivo de bloco. Do jeito que está, nosso script não vai dar conta.
./script2.sh /dev/sda
Podemos fazer uso da lógica. OR
operador e inclua outro teste na segunda instrução if. Desta vez, se o arquivo for um arquivo de dispositivo de caractere qualquer um arquivo de dispositivo de bloco, o teste retornará true. Este é “script3.sh”.
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 is missing or not a regular file." fi if [[ -c $1 || -b $1 ]] then echo "The file $1 is a character or block device file." else echo "The file $1 is missing or not a special file." fi
Este script reconhece arquivos de dispositivo de caracteres e arquivos de dispositivo de bloco.
./script3.sh /dev/random
./script3.sh /dev/sda
Se for importante para você diferenciar os diferentes tipos de arquivos do dispositivo, você pode usar if
declarações. Este é “script4.sh”.
#!/bin/bash if [[ -f $1 ]] then echo "The file $1 exists." else echo "The file $1 is missing or not a regular file." fi if [[ -c $1 ]] then echo "The file $1 is a character device file." else if [[ -b $1 ]] then echo "The file $1 is a block device file." else echo "The file $1 is missing or not a device file." fi fi
Este script reconhece e categoriza arquivos de dispositivo de caractere e arquivos de dispositivo de bloco.
./script4.sh /dev/random
./script4.sh /dev/sda
Usando o operador lógico AND, podemos testar vários recursos de uma só vez. Este é “script5.sh”. Verifique se existe um arquivo S o script leu S permissões de gravação para ele.
#!/bin/bash if [[ -f $1 && -r $1 && -w $1 ]] then echo "The file $1 exists and we have read/write permissions." else echo "The file $1 is missing, not a regular file, or we can't read/write to it." fi
Executaremos o script em um arquivo que pertence a nós e um que pertence a root
.
./script5.sh .bashrc
./script5.sh /etc/fstab
Para verificar a existência de um diretório, use o -d
Teste. Este é “script6.sh”. Faz parte de um script de backup. A primeira coisa que faz é verificar se o diretório passado na linha de comando existe ou não. usar lógica NOT
operador !
no if
prova de declarações
#!/bin/bash if [[ ! -d $1 ]] then echo "Creating backup directory:" $1 mkdir $1 if [[ ! $? -eq 0 ]] then echo "Couldn't create backup directory:" $1 exit fi else echo "Backup directory exists." fi # continue with file backup echo "Backing up to: "$1
Se o diretório não existir, crie-o. Se os arquivos de compilação do diretório, o script for encerrado. Se a criação do diretório for bem-sucedida ou se o diretório já existir, o script continuará com suas ações de backup.
Vamos executar o script e depois verificá-lo com ls
e ele -d
(diretório) se o diretório de backup existir.
./script6.sh Documents/project-backup
ls -d Documents/project-backup
O diretório de backup foi criado. Se executarmos o script novamente, ele deverá informar que o diretório já está presente.
./script6.sh
O script encontra o diretório e continua a fazer o backup.
Tente, não assuma
Mais cedo ou mais tarde, suposições levarão a coisas ruins acontecendo. Tente primeiro e reaja de acordo.
Conhecimento é poder. Use testes para dar aos seus scripts o conhecimento de que eles precisam.
RELACIONADO: Como permitir que scripts do Linux detectem que estão sendo executados em máquinas virtuais
[ad_2]