Что не так с моим массивом bash? - PullRequest
7 голосов
/ 13 сентября 2009

Может кто-нибудь сказать мне, почему этот скрипт bash работает, если я вырезал и вставил его в терминал, но выдает «server_prep.sh: 7: Синтаксическая ошибка:» («неожиданно» при запуске с использованием $ sudo sh server_prep.sh?

#!/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

Заранее спасибо!

Ответы [ 2 ]

19 голосов
/ 13 сентября 2009

Вы на Ubuntu?

Тогда вам следует изменить строку #!- вверху, чтобы она читалась как #!/bin/bash, потому что / bin / sh - очень ограниченная оболочка.

Это объясняет, почему работает в терминале (где оболочкой является bash), а не как сценарий оболочки (который запускается /bin/sh).

Они изменили это пару выпусков назад по соображениям производительности - большинству людей не нужна полная функциональность bash для сценария оболочки, и эта ограниченная оболочка намного быстрее при запуске.

Редактировать: Я только что заметил, что вам даже не нужно использовать массив, так как вы все равно конвертируете его в разделенную пробелами строку в цикле for. Просто удалите круглые скобки в назначении и поместите вместо них кавычки (а также удалите пробелы вокруг знака равенства, как предложил хакер )

7 голосов
/ 13 сентября 2009

Попробуйте

required_gems=( rake rails sqlite3-ruby )

вместо этого (обратите внимание на отсутствие пробелов вокруг '=').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...