使用“sh script.sh”或“./script.sh”运行shell脚本会产生两种不同的结果?

时间:2014-02-06 21:52:06

标签: bash shell

我无法理解我的Ubuntu unix环境如何处理脚本执行。我编写了以下bash脚本(称为script.sh)来表示我的困惑:

#!/usr/bin/env bash
if [ $1 == "yes" ]; then
    echo -ne "Caught\n"
fi
if [ $1 != "yes" ]; then
    echo -ne "Not Caught\n"
fi

当我使用sh script.sh yes执行此脚本时,我得到以下输出:

`tester.sh: 2: [: yes: unexpected operator`

但是,当我使用chmod 775 script.sh使脚本可执行,然后使用命令./script.sh yes时,我得到了Caught的适当输出。

有人可以告诉我我做错了什么吗?无论我使用sh还是./方法,我都希望脚本能够正确执行。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

你必须使用单=而不是==这是一种基础,即不是标准。

所以当你运行./script.sh bash解释你的脚本时,一切都很好。当你运行sh script.sh时,另一个程序会执行此操作(可能是伪装*,破折号甚至是bash伪装*)。

  

无论我使用sh还是./,我希望脚本能够正确执行   方法

然后不要依赖==等非便携式功能。


  • 伪装成bash我的意思是bash关注argv [0] - 你称呼它的方式 - 并采取相应的行动。如果你称之为sh(可能使用链接),那么它会尝试表现得像Bourne shell那样。

答案 1 :(得分:2)

sh ...将使用shell运行您的脚本,而不是bash ...让您的脚本使用shabang中指定的内容,首先使您的脚本可执行,然后使用./script.sh

运行它