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
bash
shell-script
Buzu
la source
la source
#!/bin/bash
Réponses:
Vous exécutez un script écrit pour bash sous sh , qui manque de nombreuses fonctionnalités de syntaxe étendues -
[[
est unebash
commande intégrée et n'est pas disponible danssh
.Passez
#!/bin/sh
à#!/bin/bash
ou à#!/usr/bin/env bash
.la source
/bin/sh
est un lien symbolique vers/bin/bash
. Et il est probablement raisonnablement sûr de supposer quebash
c'est le cas/bin/bash
./bin/bash
sur la plupart des systèmes Linux, mais/usr/pkg/bin/bash
sur les BSD, ou/usr/local/bin/bash
si l'on compile directement à partir de la source./usr/bin/env
hack (qui utilise celui quibash
se trouve actuellement dans les appelants$PATH
), mais YMMV. (Et vous pouvez créer/bin/bash
un lien symbolique - si vous avez des droits d'administrateur et que cela ne vous dérange pas de jouer avec/bin
.)/usr/local
c'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.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
la source