2009-09-13 58 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) 

代替(注意缺少周圍的空間 '=')。