![对于同一测试,什么时候 [[ ]] 测试会失败而 [ ] 会成功?](https://linux22.com/image/162533/%E5%AF%B9%E4%BA%8E%E5%90%8C%E4%B8%80%E6%B5%8B%E8%AF%95%EF%BC%8C%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%20%5B%5B%20%5D%5D%20%E6%B5%8B%E8%AF%95%E4%BC%9A%E5%A4%B1%E8%B4%A5%E8%80%8C%20%5B%20%5D%20%E4%BC%9A%E6%88%90%E5%8A%9F%EF%BC%9F.png)
我遇到了一个脚本,其中包含以下行:
java_version=$($JAVA_HOME/bin/java -version 2>&1 | awk -F '"' '/version/ {print $2}' | cut -d '_' -f 1,3)
接下来是测试:
if [[ -n "$java_version" ]]; then
...
从命令行调用时测试成功。当从 Java 应用程序调用时失败。
一些有用的注释:
- 脚本中的第一行是
#!/usr/bin/env bash
。 - 从命令行调用时测试成功意味着
java_version
不为空。为了进一步验证,我echo
会在测试之前将 的值java_version
写入某个外部文件并在那里找到该值。 - 我将双括号更改为单数,并且测试成功地从命令行和 Java 应用程序调用了脚本。
- 我正在运行 GNU/Linux Ubuntu 18.04、bash 版本 4.4.20、Java 8 (Oracle JDK)。
关于什么可能导致这种行为改变有什么想法吗?
答案1
我将以下行添加到脚本中以查找正在运行的 shell:
ps -p $$ > /path/to/some_file
发现运行的shell是/bin/sh
不支持双括号语法。双括号仅在少数 shell 中受支持(来源)。
所有的功劳都归功于那些在我的帖子下发表评论的人。