QT 程序包含一个带有 if-test-then 块和转义的必要引号的 bash 脚本问题错误

Posted

技术标签:

【中文标题】QT 程序包含一个带有 if-test-then 块和转义的必要引号的 bash 脚本问题错误【英文标题】:QT program containing a bash script with an if-test-then block and the escaped necessary quotes inside issues error 【发布时间】:2016-06-08 08:33:29 【问题描述】:

我正在尝试在 QT 应用程序中运行一个小型 bash 脚本,其中包含一个 if-test-then 块和测试中的必要引号。由于脚本应该由 QT 编译并由 bash 运行,因此引号必须转义两次,因此在我看来,引号的转义反斜杠也必须转义。不幸的是,它没有按预期工作。

代码如下:

#include <stdio.h>

QObject *parent;

int main(int argc, const char* argv[])

    QProcess *myProcess = new QProcess(parent);
    myProcess->execute("/bin/bash -c \"x=1 ; echo $x ; if [ \\\"$x\\\" = \\\"1\\\" ] ; then echo itsOne ; fi\"");

当我运行编译后的程序时,我得到了输出:

    root@debian:~# ./proggy
    1
    /bin/bash: line 0: [: missing `]'

在 bash 终端中尝试相同的脚本时,而不是此处看到的输出:

    root@debian:~# x=1 ; echo $x ; if [ "$x" = "1" ] ; then echo itsOne ; fi
    1
    itsOne

我在 QT 程序中尝试了各种转义和引号的组合,到目前为止没有任何帮助。

有谁知道这里出了什么问题或如何解决这个谜语?不知何故,测试命令中的转义引号似乎破坏了 bash 看到的脚本。如果 test 命令中有两个必要的引号,为什么 bash 看不到右括号?

【问题讨论】:

使用raw string literal 可能会更容易。 gcc 版本是 4.4.5,因此很遗憾原始字符串文字不可用。 【参考方案1】:

几点。

首先,execute 是 QProcess 的静态成员,因此无需创建 QProcess 的实例。

其次,使用execute overload 将程序名称与参数列表分开通常更容易。

考虑到这一点,您想要的可能是......

QProcess::execute("/bin/bash", QStringList() << "-c" << "x=1 ; echo $x ; if [ \\\"$x\\\" = \\\"1\\\" ] ; then echo itsOne ; fi");

【讨论】:

【参考方案2】:

您的实际 bash 字符串是错误的(开头带有 /bin/bash 的字符串,而不是原始字符串)。首先在 bash 中调试它,因为这在 bash 中不起作用:

/bin/bash -c "x=1 ; echo $x ; if [ \"$x\" = \"1\" ] ; then echo itsOne ; fi"

您可以使用单引号替换外部双引号,以便在 bash 中运行:

/bin/bash -c 'x=1 ; echo $x ; if [ "$x" == "1" ] ; then echo itsOne ; fi'

然后你可以做你的最后陈述:

myProcess->execute("/bin/bash -c 'x=1 ; echo $x ; if [ \"$x\" == \"1\" ] ; then echo itsOne ; fi'");

在哪里(因为我没有我的 qt 电脑,所以我无法为你测试最后一部分):

qDebug() << "bin/bash -c 'x=1 ; echo $x ; if [ \"$x\" == \"1\" ] ; then echo itsOne ; fi'" << endl;

应该产生:

/bin/bash -c 'x=1 ; echo $x ; if [ "$x" == "1" ] ; then echo itsOne ; fi'

【讨论】:

不,执行产生: ;: -c: line 0: 寻找匹配的 `'' 时出现意外 EOF ;: -c: line 1: 语法错误:文件意外结束 @forenbuddy 啊,好的...稍后当我在我的 qt 电脑上时,我将不得不调试那个位。但是你应该可以在 bash 终端中输入这个 /bin/bash -c 'x=1 ; echo $x ; if [ "$x" == "1" ] ; then echo itsOne ; fi' 并且它可以工作。然后你的 qDebug() 应该显示相同的输出......

以上是关于QT 程序包含一个带有 if-test-then 块和转义的必要引号的 bash 脚本问题错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有数据的标题添加到 Qt 中的 QTableWidget?

如何将 qrc 数据包含到使用 CMake 编译的基于 Qt 的二进制文件中

在 QT 中用完全透明的笔“绘图”

带有 Qt/c++ 和 openseemap 的桌面地图应用程序

带有 qt 的 Unix 串行端口程序崩溃

Qt创建者:创建一个兼容多个ABI的APK?