Script de bash: “[[: not found”]

3

Este é o meu código:

#!/bin/bash
if [[ -d ~/viwiki ]]; then
 cd ~/viwiki
else
 mkdir ~/viwiki
 cd ~/viwiki
fi
if ! [[ -d ./log ]]; then
 mkdir log
 mkdir log/log
 mkdir "log/wget"
elif ! [[ -d ./log/log ]]; then
 mkdir log/log
elif ! [[ -d "./log/wget" ]]; then
 mkdir "log/wget"
fi

Ao executar, há erros:

tuankiet65@UbuntuPC:~$ sh viwik/test2.sh
viwik/test2.sh: 2: viwik/test2.sh: [[: not found
viwik/test2.sh: 8: viwik/test2.sh: [[: not found

Como posso corrigir isso?

    
por Hồ Tuấn Kiệt 14.02.2013 / 11:53

1 resposta

9

Suponho que, se você executar

readlink -f $(which sh)

você não receberá o Bash como valor de retorno, mas o Dash. Você tem o preâmbulo correto, mas isso só importa se você executar o script como ./test2.sh depois de torná-lo executável.

Agora você força o script através do interpretador sh , que provavelmente é o Dash, e a construção [[]] é específica do Bash.

Isso é "por quê?" Se você acabou de substituir os colchetes duplos por simples (e altere #!/bin/bash para #!/bin/sh , já que seu script agora está usando apenas as funções POSIX), ele deve ser executado como desejado.

Demonstração no Debian, com test.sh com conteúdo:

#!/bin/bash
if [[ "string" == "string" ]]; then
    echo This is Bash
fi

isso acontece:

$ readlink -f $(which sh)
/bin/dash
$ sh test.sh 
test.sh: 2: test.sh: [[: not found
$ bash test.sh 
This is Bash
$ chmod 755 test.sh
$ ./test.sh
This is Bash
    
por 14.02.2013 / 12:05