尝试使用参数扩展进行字符串替换时替换错误

问题描述

也许这是一个愚蠢的问题,但我正在编写一个非常小的 Gedit 外部工具,用于在按键时编译 .qrc(Qt 资源文件)。这是我的代码

echo $GEDIT_CURRENT_DOCUMENT_PATH
pyrcc $GEDIT_CURRENT_DOCUMENT_PATH -o ${GEDIT_CURRENT_DOCUMENT_PATH/.qrc/.py}

运行上面,我得到

/home/user/.local/lib/python3/qrecartivi/resources.qrc
/home/user/.config/gedit/tools/new-tool: 12: /home/user/.config/gedit/tools/new-tool: Bad substitution

其中第 12 行实际上是我的 sh 代码的第 2n 行(此偏移是由于 gedit 添加了一些注释)。 我只是想不通为什么这个替换应该是错误的。提前致谢。

解决方法

正如@chepner 在评论中所述,您的 shell 解释器 (Dash) 不支持语法 ${var/str1/str2},它严格符合 POSIX。

您有两种解决方案:

  • 使用支持这种变量替换的 Bash

  • 使用符合 POSIX 的方式将扩展名替换为另一个扩展名。像这样例如:

pyrcc "$GEDIT_CURRENT_DOCUMENT_PATH" -o "$(basename "$GEDIT_CURRENT_DOCUMENT_PATH" .qrc).py"