我使用 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
来启动脚本,或者
- 使用
bash
, 或 - 使脚本可执行并
#!
在指向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
或类似的东西。