Estoy tratando de escribir un script que tenga que verificar si existe un archivo. En la consola escribo
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi
y consigo
not mod
pero cuando escribo un guión para hacer lo mismo:
#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi
y luego ejecuto el script, obtengo esto:
./ex.sh: 2: [[: not found
mod
Guardé el script en el directorio actual y lo llamé ex.sh, luego me aseguré de que sea ejecutable. Para llamar al guión hago esto:
./ex.sh
¿Por qué tengo este problema? Ya probé muchas cosas:
if [ -a /home ...
y
if test -a /home ...
Ambos regresan
13: -a: unexpected operator
bash
shell-script
Buzu
fuente
fuente

#!/bin/bashRespuestas:
Está ejecutando un script escrito para bash bajo sh , que carece de muchas de las características de sintaxis extendida:
[[es unbashcomando incorporado y no está disponible ensh.Cambiar
#!/bin/sha#!/bin/basho para#!/usr/bin/env bash.fuente
/bin/shes un enlace simbólico a/bin/bash. Y probablemente sea razonablemente seguro asumir quebashes así/bin/bash./bin/bashen la mayoría de los sistemas Linux, pero/usr/pkg/bin/bashen BSD, o/usr/local/bin/bashsi se compila directamente desde la fuente./usr/bin/envhack (que usa el quebashesté en las personas que llaman$PATHen este momento), pero YMMV. (Y puedes hacer/bin/bashun enlace simbólico, si tienes derechos de administrador y no te importa jugar con él/bin.)/usr/locales donde autotools decide ponerlo por defecto. En lo que respecta a "personalmente", me gusta tener varios servidores y máquinas virtuales diferentes extraídos del mismo repositorio de scripts / herramientas, y no tener que volver a editar los shebangs en la mitad de ellos después de cada confirmación.Especifique bash en lugar de sh cuando ejecute el script. Personalmente noté que son diferentes en ubuntu 12.10:
bash script.sh arg0 ... argnfuente