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!
這怎麼可能?
- 它說變數的值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 的其他地方有重複的答案,但我找不到它們。到目前為止,我得到的最接近的是這個相關的,它提供了更多細節