2009-09-13 59 views
7

谁能告诉我为什么这个bash脚本工作,如果我剪切并粘贴到终端,但会抛出“server_prep.sh:7:语法错误:”(“意外”启动时使用$ sudo sh server_prep.sh?我的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 

提前感谢!

+1

您是否也收到“sudo/bin/bash server_prep.sh” ? – Andomar 2009-09-13 19:36:42

回答

19

你在Ubuntu?

然后,您应该将顶部的#!-行更改为#!/bin/bash,因为/ bin/sh是一个非常有限的shell。

这将解释为什么在终端(其中shell是bash)而不是作为shell脚本(由/ bin/sh运行)中工作。

由于性能方面的原因,他们对此进行了一些更改 - 大多数人不需要shell脚本的完整bash功能,而且这个受限制的shell在启动时速度更快。

编辑:我刚刚注意到,你甚至不必使用数组,因为你将它转换为for循环中的空格分隔字符串。只需删除作业中的括号并在其周围添加引号(也可以删除等号周围的空格,因为建议使用黑客

+0

将'dash'改为'bash'是个好主意,但是这个脚本不应该在终端上运行... – 2009-09-13 19:34:17

+0

好点。我刚刚注意到,首先使用数组真的没有问题,因为它转换为空格分隔的字符串:) – 2009-09-13 19:56:16

+0

羞愧我无法拆分接受,因为你们都是对的。谢谢! – ChrisInCambo 2009-09-13 20:02:50

7

尝试

required_gems=(rake rails sqlite3-ruby) 

代替(注意缺少周围的空间 '=')。