C++ 包含带有if-test-then块的bash脚本的QT程序以及内部转义的必要引号会发出错误

C++ 包含带有if-test-then块的bash脚本的QT程序以及内部转义的必要引号会发出错误,c++,linux,qt,shell,C++,Linux,Qt,Shell,我试图在一个QT应用程序中运行一个小bash脚本,其中包含一个if-test-then块和测试中必要的引号。由于脚本应该由QT编译并由bash运行,因此引号必须转义两次,因此引号的转义反斜杠也必须转义,正如我看到的那样。不幸的是,它没有像预期的那样工作 代码如下: #include <stdio.h> QObject *parent; int main(int argc, const char* argv[]) { QProcess *myProcess = new QP

我试图在一个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\"");
}
在bash终端中尝试相同的脚本时,不是此处显示的输出:

    root@debian:~# x=1 ; echo $x ; if [ "$x" = "1" ] ; then echo itsOne ; fi
    1
    itsOne
我在QT程序中尝试了各种转义和引号的组合,到目前为止没有任何效果

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

有几点

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

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

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

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

QProcess::execute(“/bin/bash”,QStringList()您的实际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 pc):


使用a可能会使这更容易。gcc版本是4.4.5,因此很遗憾,原始字符串文本不可用。否,执行生成:;:-c:第0行:在查找匹配的“%1”时出现意外EOF;:-c:第1行:语法错误:意外结束file@forenbuddy啊,好吧……等我上qt电脑的时候,我得调试一下。但是你应该d能够将这个
/bin/bash-c'x=1;echo$x;if[“$x”==“1”];然后将它的一个;fi'
回显到bash终端中,它就工作了。然后qDebug()应该显示相同的输出。。。
myProcess->execute("/bin/bash -c 'x=1 ; echo $x ; if [ \"$x\" == \"1\" ] ; then echo itsOne ; fi'");
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'