Estou tentando escrever um script que precisa verificar se existe um arquivo. No console eu escrevo
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi
e eu recebo
not mod
mas quando escrevo um script para fazer a mesma coisa:
#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi
e, em seguida, execute o script, recebo o seguinte:
./ex.sh: 2: [[: not found
mod
Salvei o script no diretório atual e o nomeei ex.sh, depois verifiquei que ele é executável. Para chamar o script, eu faço isso:
./ex.sh
Por que estou recebendo esse problema? Eu já tentei muitas coisas:
if [ -a /home ...
e
if test -a /home ...
Ambos retornam
13: -a: unexpected operator
bash
shell-script
Buzu
fonte
fonte
#!/bin/bash
Respostas:
Você está executando um script escrito para o bash sob sh , que não possui muitos dos recursos de sintaxe estendida -
[[
é umbash
comando interno e não está disponível nosh
.Mude
#!/bin/sh
para#!/bin/bash
ou para#!/usr/bin/env bash
.fonte
/bin/sh
é um link simbólico para/bin/bash
. E provavelmente é razoavelmente seguro supor quebash
é/bin/bash
./bin/bash
na maioria dos sistemas Linux, mas/usr/pkg/bin/bash
em BSDs, ou/usr/local/bin/bash
se um compilar diretamente da fonte./usr/bin/env
hack (que usa o quebash
acontecer com os chamadores$PATH
no momento), mas o YMMV. (E você pode fazer/bin/bash
um link simbólico - se você tem direitos de administrador e você não se importa de brincar com/bin
.)/usr/local
é onde o autotools decide colocá-lo por padrão. No que diz respeito "pessoalmente", eu gosto de ter vários servidores e VMs diferentes retirados do mesmo repositório de scripts / ferramentas, e não precisar reeditar os shebangs na metade deles após cada confirmação.Especifique bash em vez de sh ao executar o script. Eu pessoalmente notei que eles são diferentes no ubuntu 12.10:
bash script.sh arg0 ... argn
fonte