我无法理解我的 Ubuntu unix 环境如何处理脚本执行。我写了以下 bash 脚本(称为 script.sh
)来表示我的困惑:
#!/usr/bin/env bash
if [ $1 == "yes" ]; then
echo -ne "Caughtn"
fi
if [ $1 != "yes" ]; then
echo -ne "Not Caughtn"
fi
当我使用 sh script.sh yes
执行此脚本时,我得到以下输出:
`tester.sh: 2: [: yes: unexpected operator`
但是,当我使用 chmod 775 script.sh
使脚本可执行,然后使用命令 ./script.sh yes
时,我得到了适当的输出 Caught
。
有人可以告诉我我做错了什么吗?无论我使用 sh
还是 ./
方法,我都希望脚本正确执行。
感谢您的任何帮助!
sh ...
将使用shell而不是bash运行脚本。要使脚本使用 Shabang 中指定的内容,请先使脚本可执行,然后使用 ./script.sh
运行它
你必须使用单个=
而不是==
这是一种害羞主义,即不是标准的。
因此,当您运行 ./script.sh bash
时,它会解释您的脚本,一切都很好。当你运行sh script.sh
不同的程序时,它会这样做(可能是旧的bourne sh,dash甚至伪装bash
*)。
我希望脚本正确执行,无论我使用 sh 还是 ./ 方法。
然后不要依赖非便携式功能,例如 ==
.
- 通过伪装
bash
,我的意思是bash
关注 argv[0] - 你称之为它的方式 - 并采取相应的行动。如果你称它为sh
(也许使用链接),那么它就会尝试像 Bourne shell 一样运行。