【问题标题】:bash script not exiting correctly after EOF error (expecting then);EOF 错误后 bash 脚本未正确退出(预计那时);
【发布时间】:2012-01-03 12:29:57
【问题描述】:

我的以下脚本产生错误(它抱怨在文件退出之前需要'then'关键字。我找不到错误。如果你有时间请帮忙。

谢谢你, 丝兰

#!/bin/sh
#Makes the /usr/lib/jvm in case...
sudo mkdir -p /usr/lib/jvm;
sudo mkdir /org-thejarbar-work-dir;
cd /org-thejarbar-work-dir;

#Update this line to reflect newer versions of JDK...
wget http://download.oracle.com/otn-pub/java/jdk/7u1-b08/jdk-7u1-linux-i586.tar.gz;

#Extract the download
tar -xvf ./*gz;

#Move it to where it can be found...
sudo mv ./* /usr/lib/jvm/;
sudo ln -s /usr/lib/jvm/jdk1*/bin/java /usr/bin/;
sudo rm -rf /org-thejarbar-work-dir;

#Makes the /usr/lib/maven in case...
sudo mkdir -p /usr/lib/maven;
sudo mkdir /org-thejarbar-work-dir;
cd /org-thejarbar-work-dir;

#Update this line to reflect newer versions of maven
wget http://mirrors.powertech.no/www.apache.org/dist//maven/binaries/apache-maven-3.0.3-bin.tar.gz;
tar -xvf ./*gz;

#Move it to a more logical location
sudo mv ./* /usr/lib/maven/;

#If you have Maven on Windows and use VirtualBox, you can set up the maven to be a virtualbox shared folder.
#The name must match the name used below (ignore if irrelevant to you).
sudo mount -t vboxsf maven /usr/lib/maven;

#Link the new Maven to the bin...
sudo ln -s /usr/lib/maven/apache-maven-*/bin/mvn /usr/bin/;
sudo rm -rf /org-thejarbar-work-dir;
sudo mkdir /org-thejarbar-work-dir;
cd /org-thejarbar-work-dir;

#Update this line to reflect newer versions of Netbeans or replace 'javase' with 'javaee' or add Java EE manually via
#Netbeans 'plugins as needed.
wget http://download.netbeans.org/netbeans/7.0.1/final/bundles/netbeans-7.0.1-ml-javase-linux.sh;
sh //*sh;
sudo mv ./* /usr/lib/ide/;

#Add Netbeans launcher to your PATH. Doing so allows you to run 'netbeans' command from the terminal
sudo ln -s /usr/lib/ide/netbeans-7*/bin/netbeans /usr/bin/;

#If you use VirtualBox , you can share your projects between Host and guest. Name of shared
#folder must match 'NetBeansProjects' Remove this if you don't need...
if [ ! -d "~/NetBeansProjects" ]; then
    sudo mkdir ~/NetBeansProjects;
fi

sudo mount -t vboxsf NetBeansProjects ~/NetBeansProjects;
sudo rm -rf /org-thejarbar-work-dir;
sudo mkdir /org-thejarbar-work-dir;
cd /org-thejarbar-work-dir;

#Update this line to reflect newer versions of Netbeans or replace 'javase' with 'javaee' or add Java EE manually via
#Netbeans 'plugins as needed.
wget http://download.netbeans.org/netbeans/7.0.1/final/bundles/netbeans-7.0.1-ml-javase-linux.sh;
sh //*sh;
sudo mv ./* /usr/lib/ide/;

#Add Netbeans launcher to your PATH. Doing so allows you to run 'netbeans' command from the terminal
sudo ln -s /usr/lib/ide/netbeans-7*/bin/netbeans /usr/bin/;

#If you use VirtualBox , you can share your projects between Host and guest. Name of shared
#folder must match 'NetBeansProjects' Remove this if you don't need...
if [ ! -d "~/NetBeansProjects" ]; then
    sudo mkdir ~/NetBeansProjects;
fi

sudo mount -t vboxsf NetBeansProjects ~/NetBeansProjects;
sudo rm -rf /org-thejarbar-work-dir;
sudo mkdir /org-thejarbar-work-dir;
cd /org-thejarbar-work-dir;
sudo wget http://download-ln.jetbrains.com/idea/ideaIC-11.tar.gz
sudo tar -zxvf ./*.gz;

#Move it to a better location...
sudo rm -rf /usr/lib/ide/idea-IC*;
sudo mv ./* /usr/lib/ide/;

#Add IDEA launcher to your PATH. Doing so allows you to run 'idea.sh' command from the terminal
rm /usr/bin/idea.sh;
sudo ln -s /usr/lib/ide/idea-IC*/bin/idea.sh /usr/bin/;

#If you use VirtualBox , you can share your projects between Host and guest. Name of shared
#folder must match 'IdeaProjects' Remove this if you don't need...
if [ ! -d "~/IdeaProjects" ]; then
    sudo mkdir ~/IdeaProjects;
fi

sudo rm -rf /org-thejarbar-work-dir;

exit 0;

请注意,该脚本有效(执行所需的操作),但由于我正在与其他人共享此脚本,因此该错误很麻烦。我正在努力避免这个错误。

【问题讨论】:

  • 你能发布你的shell(即ls -l /bin/sh的输出)吗?该脚本似乎在我的机器上运行良好。
  • 这不会解决您的问题,但“;”在每个命令行的末尾都不需要。如果您想在同一行上执行多个命令,则使用它们。我发现自己也这样做了,尤其是在编写代码之后:)。
  • @phihag Sure :) 输出显示:yucca-VirtualBox:~$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 2011-12-12 09:47 /bin/sh -> dash
  • //*sh 中有什么内容?那行看起来像是一个错字,可能是罪魁祸首。
  • 顺便说一句,你应该把你的临时目录放在/tmp(或者可能是/var/tmp)。基本卫生要求应该可以同时运行该脚本的多个实例,因此请使用唯一的临时目录名称。即使要求看起来是理论上的,调试这类问题也是一场噩梦。

标签: bash eof


【解决方案1】:

首先,这不是一个 bash 脚本——它是一个 bourne shell 脚本。如果您想使用 bash,请将第一行(“shebang”)更改为使用/bin/bash。您在评论中表明/bin/sh 实际上是您系统中的dash。 dash 是 bourne shell 的最小实现。

您可以使用-x 运行bash 脚本来调试它,例如:/bin/bash -x script.sh;或将 shebang 更改为 #!/bin/bash -x(暂时)。

顺便说一句,您正在测试目录并在它们不存在时创建它们。如果这就是您在 if 子句中要做的所有事情,您可以使用普通的mkdir -p,这样如果路径已经存在,它就不会引发错误。请注意,它可能并非在所有 *nix 系统中都可用,但它在 GNU/Linux 中。

【讨论】:

  • 你会推荐 bash 而不是 bourne 吗?我只想针对非 Mac Unix?
  • 如果您的目标是 Solaris、AIX 和 HP/UX,那么一定要坚持使用 bourne。在我看来,如果你有疑问也坚持使用 bourne,除非 bash 功能会让你的生活更轻松。请注意,您也可以将 -x 与 bourne 一起使用。
  • Bourne 的使用范围更广,但更难于便携和健壮地编写。如果您的目标平台是 Linux,则需要 Bash 是合理的(但记录此要求)。
  • @tripleee - 我同意你所说的大部分内容,但为什么你认为 bourne 更难编写便携?我会说它根据定义是可移植的。
  • 取决于您想要的向后便携性。 SunOS、AIX、HP-UX 等的旧版本有错误的sh 实现和残暴的用户空间实用程序;但是,如果您将目标限制在合理地兼容 POSIX 的平台上,那么至少您知道要解决哪些限制。
【解决方案2】:

查看sh //*sh;,看看你有哪些脚本,如果有任何匹配? 此行基本上匹配并运行位于/ 路径下的任何以 sh 结尾的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多