我无法理解我的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
还是./
方法,我都希望脚本能够正确执行。
感谢您的帮助!
答案 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