![bash 中的字符串比较否定行为不正常?](https://linux22.com/image/206093/bash%20%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%AF%94%E8%BE%83%E5%90%A6%E5%AE%9A%E8%A1%8C%E4%B8%BA%E4%B8%8D%E6%AD%A3%E5%B8%B8%EF%BC%9F.png)
我有这个小 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 上的其他地方有重复的答案,但我找不到它们。到目前为止我得到的最接近的是这个相关的,它提供了更多细节