bash 中的字符串比较否定行为不正常?

bash 中的字符串比较否定行为不正常?

我有这个小 bash 脚本:

readonly imagick_extension=$(cat "${php_configuration_file}" | grep imagick)
echo "Imagick extension grep value: $imagick_extension"
if [ "${imagick_extension}" != "extension=imagick.so" ]; then
        echo "ERROR: Imagick PHP extension is not enabled!"
        exit 1
fi
echo "Imagick PHP extension is enabled."

输出是:

Imagick extension grep value: extension=imagick.so
ERROR: Imagick PHP extension is not enabled!

这怎么可能?

  • 它表示变量的值 extension=imagick.so,

  • 但它仍然进入 if 子句,只有当它满足时才应该进入 if 子句不是 extension=imagick.so

提前致谢!

答案1

这里的问题是您有一个在 Windows 上创建的 PHP 配置文件。因此,它的行结尾是 CR/LF,而不是 UNIX 标准的 LF。

您可以通过echo像这样修改命令来证明这一点

echo "Imagick extension grep value: < $imagick_extension >"

正如在一个评论您会看到输出的最后一个空格位于>行的开头,这表明该值中确实存在嵌入的换行符:

 >agick extension grep value: extension=imagick.so

简单的解决方案是将文件转换为 UNIX 格式:

dos2unix /path/to/php_configuration_file.ini

或者,如果您没有简单的dos2unix命令,可以使用以下sed替代方法:

sed -i 's/\r//' /path/to/php_configuration_file.ini

我确信 UNIX&Linux 上的其他地方有重复的答案,但我找不到它们。到目前为止我得到的最接近的是这个相关的,它提供了更多细节

相关内容