任何人都可以告诉我为什么这个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
提前致谢!
答案 0 :(得分:19)
你在ubuntu上吗?
然后你应该更改顶部的#!-
行来阅读#!/bin/bash
,因为/ bin / sh是一个非常有限的shell。
这可以解释为什么在终端(shell是bash)中工作但不能作为shell脚本(由/ bin / sh运行)。
由于性能原因,他们在几个版本之前对此进行了更改 - 大多数人不需要shell脚本的完整bash功能,而且这个有限的shell在启动时要快得多。
编辑:我刚注意到你甚至不必使用数组,因为无论如何你都要将它转换为for循环中的空格分隔字符串。只需删除作业中的括号并在其周围加上引号(并删除等号周围的空格,如 hacker 建议的那样)
答案 1 :(得分:7)
尝试
required_gems=( rake rails sqlite3-ruby )
而是(注意'='周围缺少空格)。