Script de shell: se várias condições

6

Eu quero criar um script de shell que ecoa algo se 3 diretórios não existirem.

Aqui está o código que eu escrevi: test.sh:

if [ ! -d "/home/unix/POSTagger2" ] || [! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09"] || [! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09"]; then
echo "Nope"
fi

Quando eu executo, recebo este erro:

./test.sh: line 1: [!: command not found

O que há de errado com minha sintaxe?

    
por Henley Chiu 20.07.2016 / 20:15

2 respostas

13

Você está perdendo alguns espaços, por exemplo, [! deve ser [ ! e "] deve ser " ] . Veja o código correto:

#!/bin/bash
if 
[ ! -d "/home/unix/POSTagger2" ] || 
[ ! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" ] || 
[ ! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09" ] 
then
      echo "Nope"
fi

Outra forma para o seu código:

#!/bin/bash
for dir in "/home/unix/POSTagger2" "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09"; do
     if [ ! -d "$dir" ]; then echo nope ; break; fi 
done  
    
por 20.07.2016 / 20:20
7

Você precisa de um espaço entre o [ e o ! para que as coisas funcionem corretamente. Isso ocorre porque o [ é implementado como um comando embutido no shell (que até mesmo costumava ser um% exectuable/usr/bin/[ separado).

Você também pode usar:

if [ ! -d "/home/unix/POSTagger2" -o ! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" -o ! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09") ] ; then
    echo "Nope"
fi

O Bash oferece uma alternativa [[ que é implementada como expressão en. [[ usa && , || , etc. em vez de -a , -o como operadores.

if [[ ! (-d "/home/unix/POSTagger2" && -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" && -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09") ]] ; then
    echo yes
fi

Edit: Graças aos comentários de @LucianoAndressMartini e @pabouk para correções importantes para o meu entendimento.

    
por 20.07.2016 / 20:36