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/bash
Respuestas:
Está ejecutando un script escrito para bash bajo sh , que carece de muchas de las características de sintaxis extendida:
[[
es unbash
comando incorporado y no está disponible ensh
.Cambiar
#!/bin/sh
a#!/bin/bash
o para#!/usr/bin/env bash
.fuente
/bin/sh
es un enlace simbólico a/bin/bash
. Y probablemente sea razonablemente seguro asumir quebash
es así/bin/bash
./bin/bash
en la mayoría de los sistemas Linux, pero/usr/pkg/bin/bash
en BSD, o/usr/local/bin/bash
si se compila directamente desde la fuente./usr/bin/env
hack (que usa el quebash
esté en las personas que llaman$PATH
en este momento), pero YMMV. (Y puedes hacer/bin/bash
un enlace simbólico, si tienes derechos de administrador y no te importa jugar con él/bin
.)/usr/local
es 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 ... argn
fuente