首页 > 解决方案 > 将命令结果分配给变量时出现语法错误

问题描述

我正在使用 shunit2 单元测试框架进行一些基本的单元测试。我在函数的第一行收到错误“语法错误靠近意外标记 `nodeError=$(node "node_fake_returns/return_error.js")”。功能如下:

function testHandleNodeReturnError{
    nodeError=$( node "./node_fake_returns/return_error.js" )    
    if [ grep -i "Error" <<< "$nodeError"  ]; then
        assertTrue "true"
    fi
}

假设运行一个向标准输出返回错误消息的节点脚本,然后将该输出分配给一个变量。只有函数中的第一行很重要。

我对 bash 很陌生,而且我弄乱了这一行的格式,主要是在不同的地方添加空格,但我似乎找不到导致语法错误的原因。这可能很简单,但如果有人能告诉我可能出了什么问题,我会很感激的。

谢谢!

标签: bashtesting

解决方案


通过将您的代码粘贴到shellcheck,我得到了:

function testHandleNodeReturnError{  
                                  ^-- SC1095: You need a space or linefeed between the function name and body.

这是相当字面的。你需要一个空间。

函数 testHandleNodeReturnError

不推荐使用function关键字。只需使用.function_name() { function_body; }

if [ grep -i "错误" <<< "$nodeError" ]; 然后

这是非常错误的。这是将nodeError变量的内容输出到[命令的标准输入。是[一个命令,一个可执行文件,就像grep,它是程序的别名test。然后它以, ,和4 个参数运行[comamnd 。你不想要那个。如果要检查字符串,只需使用' 退出状态:grep-i"Error"]Errorgrep

这样做:

testHandleNodeReturnError() {
    nodeError=$(node "./node_fake_returns/return_error.js")
    if grep -q -i "Error" <<<"$nodeError"; then
        assertTrue "true"
    fi
}

推荐阅读