2009-09-13 7 views
7

Quelqu'un peut-il me dire pourquoi ce script bash fonctionne si je le coupe et le colle au terminal mais lance "server_prep.sh: 7: Erreur de syntaxe:" ("inattendu" quand lancé avec $ sudo sh server_prep.sh?Quel est le problème avec ma matrice bash?

#!/bin/sh 

#Packages 
apt-get -y install ssh libsqlite3-dev ruby-full mercurial 

#Gems 
required_gems = (rake rails sqlite3-ruby) 

#Set up directories 
[ ! -d /var/www ] && mkdir /var/www 
[ ! -d /var/www/apps ] && mkdir /var/www/apps 

#install gems manually 
if ! which gem >/dev/null; then 
    wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz 
    tar xvfz rubygems-1.3.5.tgz 
    ruby rubygems-1.3.5/setup.rb 
    ln -s /usr/bin/gem1.8 /usr/bin/gem 
    gem update --system 

    #Tidy Up 
    rm -rf rubygems-1.3.5.tgz rubygems-1.3.5 
fi 

#Install required gems 
for required_gem in "${required_gems[@]}" 
do 
    if ! gem list | grep $required_gem >/dev/null; then 
     gem install $required_gems 
    fi 
done 

Merci à l'avance!

+1

Vous obtenez également l'erreur pour "sudo/bin/bash server_prep.sh" ? – Andomar

Répondre

19

Êtes-vous sur ubuntu?

Ensuite, vous devez modifier la ligne #!- en haut pour lire #!/bin/bash car/bin/sh est un shell très limité. Cela expliquerait pourquoi fonctionne dans le terminal (où le shell est bash) mais pas en tant que script shell (qui est exécuté par/bin/sh).

Ils ont modifié cette version il y a quelques années pour des raisons de performances - la plupart des gens n'ont pas besoin de fonctionnalité bash complète pour le script shell, et ce shell limité est beaucoup plus rapide au démarrage. Je viens de remarquer que vous n'avez même pas besoin d'utiliser un tableau puisque vous le convertissez en une chaîne séparée par des espaces dans la boucle for de toute façon. Supprimez simplement les parenthèses dans l'affectation et placez des guillemets autour de lui (et supprimez également les espaces autour du signe égal, comme hacker suggéré)

+0

Changer 'dash' en' bash' est une bonne idée, mais ce script n'est pas censé fonctionner sur le terminal non plus ... –

+0

bon point. Et je viens de le remarquer, il n'y a vraiment aucune raison d'utiliser un tableau en premier lieu, puisqu'il est de toute façon converti en une chaîne séparée par un espace :) –

+0

Dommage que je ne puisse pas partager l'acceptation comme vous aviez tous les deux raison. Merci! – ChrisInCambo

7

Essayez

required_gems=(rake rails sqlite3-ruby) 

au lieu (noter le manque d'espaces autour de '=').

Questions connexes