Bash

bash 中的字元串比較否定的行為不應該如此?

  • May 20, 2022

我有這個小 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!

這怎麼可能?

  • 它說變數的值IS extension=imagick.so
  • 但它仍然進入 if 子句,只有在它不存在的情況下才應該 extension=imagick.so

提前致謝!

這裡的問題是您有一個在 Windows 上創建的 PHP 配置文件。因此,它的行結尾是 CR/LF,而不是 LF 的 UNIX 標準。

您可以通過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 的其他地方有重複的答案,但我找不到它們。到目前為止,我得到的最接近的是這個相關的,它提供了更多細節

引用自:https://unix.stackexchange.com/questions/703256