Pourquoi ai-je [[: introuvable lors de l'exécution d'un script?

15

J'essaie d'écrire un script qui doit vérifier si un fichier existe. Dans la console j'écris

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

et je reçois

not mod

mais quand j'écris un script pour faire la même chose:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

puis exécuter le script, j'obtiens ceci:

./ex.sh: 2: [[: not found
mod

J'ai enregistré le script dans le répertoire courant et l'ai nommé ex.sh, puis je me suis assuré qu'il était exécutable. Pour appeler le script, je fais ceci:

./ex.sh

Pourquoi ai-je ce problème? J'ai déjà essayé beaucoup de choses:

if [ -a /home ...

et

if test -a /home ...

Tous les deux reviennent

13: -a: unexpected operator
Buzu
la source
J'ai pu le faire fonctionner, mais pour cela j'ai dû supprimer la première ligne (#! / Bin / sh) Savez-vous pourquoi cela se produit?
Buzu
essayer#!/bin/bash
kev
bonjour kev, je l'ai aussi revu. Je viens de mettre à jour ma question. J'ai passé trop de temps là-dessus, mais je suis content d'avoir pu le résoudre. Merci pour votre réponse. C'est en effet la solution au problème.
Buzu
@Kev Veuillez poster cela comme réponse
slhck
Buzu, @Kev - si vous trouvez une réponse, postez-la comme réponse ci - dessous , ne modifiez pas la question.
user1686

Réponses:

9

Vous exécutez un script écrit pour bash sous sh , qui manque de nombreuses fonctionnalités de syntaxe étendues - [[est une bashcommande intégrée et n'est pas disponible dans sh.

Passez #!/bin/shà #!/bin/bashou à #!/usr/bin/env bash.

kev
la source
Sur certains systèmes, /bin/shest un lien symbolique vers /bin/bash. Et il est probablement raisonnablement sûr de supposer que bashc'est le cas /bin/bash.
Keith Thompson
@Keith: C'est /bin/bashsur la plupart des systèmes Linux, mais /usr/pkg/bin/bashsur les BSD, ou /usr/local/bin/bashsi l'on compile directement à partir de la source.
user1686
@grawity: Ou partout où vous décidez de le mettre si vous compilez à partir de la source. Ok, bon point. Personnellement, je préfère éditer le shebang pour chaque système que d'utiliser le /usr/bin/envhack (qui utilise celui qui bashse trouve actuellement dans les appelants $PATH), mais YMMV. (Et vous pouvez créer /bin/bashun lien symbolique - si vous avez des droits d'administrateur et que cela ne vous dérange pas de jouer avec /bin.)
Keith Thompson
@Keith: /usr/localc'est là où autotools décide de le mettre par défaut. En ce qui concerne "personnellement", j'aime avoir plusieurs serveurs et VM différents tirés du même référentiel de scripts / outils, et ne pas avoir besoin de rééditer les shebangs sur la moitié d'entre eux après chaque commit.
user1686
aucun d'eux n'a fonctionné pour moi: / im on centos
astroanu
0

Spécifiez bash au lieu de sh lors de l'exécution du script. J'ai personnellement remarqué qu'ils sont différents sous Ubuntu 12.10:

bash script.sh arg0 ... argn

Smeterlink
la source