shell脚本的改变

shell脚本的改变

我使用 bash 脚本在 CLI 上进行一些自动化测试。突然间好像不起作用了。看来我们的开发人员对操作系统做了一些更改。

我看到的错误是

bash-3.2$ sh cli-unit.sh 
cli-unit.sh: line 53: syntax error near unexpected token `('
cli-unit.sh: line 53: ` if ! diff < (echo "$EXPECTED") < (echo "$FOUND") > /dev/null; then'

代码部分是

runTest() {
    local TITLE="$1"
    local BODY="$2"
    COUNTER=$((COUNTER + 1))

    local SHELL=$(getShell "$BODY")
    local EXPECTED=$(getOutput "$BODY")
    local FOUND=$(eval "$SHELL")

    if ! diff <(echo "$EXPECTED") <(echo "$FOUND") > /dev/null; then
        echo "--- FAIL: $TITLE"
        diff <(echo "$EXPECTED") <(echo "$FOUND")
        return 1
    fi
    PASSED=$((PASSED + 1))
    return 0
}

有人可以帮我更改/纠正这个吗?我无法纠正它。提前致谢。

答案1

您的脚本显然是一个bash脚本,但您正在使用sh.

而不是显式地使用sh来启动脚本,或者

  1. 使用bash, 或
  2. 使脚本可执行并#!在指向bash解释器的第一行添加适当的 -line,然后使用 运行脚本./cli-unit.sh

sh不能期望 shell 理解特定bash的 shell 语法。


我对您展示的脚本中的一些内容还有一些进一步的问题:

  • 使用小写的 shell 变量名称,这样它们就不会意外地与系统的环境变量发生冲突。在代码中,您设置SHELL,它通常是当前 shell 解释器的路径。
  • 不要用于diff进行字符串比较。只需if [ "$variable1" != "$variable2" ]测试不平等即可。
  • 使用printf而不是echo输出变量数据(参见“为什么 printf 比 echo 更好?”)。

解决diff

if [ "$FOUND" != "$EXPECTED" ]; then
    # code as before
    return 1
fi
# code as before
return 0

在分行内if,您可能仍会diff使用展示差异(特别是如果另一个脚本或用户期待该脚本的那种输出)。另一种选择是做

if [ "$FOUND" != "$EXPECTED" ]; then
    # $FOUND is different from $EXPECTED
    printf 'FAIL (%s): Found: %s\n' "$TITLE" "$FOUND"
    printf 'FAIL (%s): Expected: %s\n' "$TITLE" "$EXPECTED"
    # other code here
 fi
 # rest of script

或类似的东西。

相关内容