对于同一测试,什么时候 [[ ]] 测试会失败而 [ ] 会成功?

对于同一测试,什么时候 [[ ]] 测试会失败而 [ ] 会成功?

我遇到了一个脚本,其中包含以下行:

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 中受支持(来源)。

所有的功劳都归功于那些在我的帖子下发表评论的人。

相关内容