0

是否可以覆盖 Bash 的内置测试?以便

[[ $1 = 'a' ]]

不仅进行测试,还输出失败时预期的结果?就像是

echo "Expected $1 to be a.'

编辑

我知道这很糟糕:-)。

4

3 回答 3

2

测试表达式复合命令执行影响所有扩展的真正短路。

$ set -x
$ [[ 0 -gt x=1+1 || ++x -eq $(tee /dev/fd/3 <<<$x) && $(echo 'nope' >&3) ]] 3>&1
+ [[ 0 -gt x=1+1 ]]
++ tee /dev/fd/2
2
+ [[ ++x -eq 2 ]]

所以是的,你可以在一个测试表达式中做任何事情。实际上,很少有测试产生副作用,并且几乎从未用于产生输出。

同样是的,保留字可以被覆盖。Bash 对 ksh 风格的函数定义比 POSIX 风格(仍然允许一些无效的名称)更宽松。

function [[ { [ "${@:1:${#@}-1}" ]; }; \[[ -a -o -a -o -a ]] || echo lulz

又一个叉形炸弹。

if function function if function if if \function & then \if & fi && \if & then \function & fi && then \function fi
于 2012-08-17T11:36:28.620 回答
1

像这样的东西?

if [[ $1 == 'a' ]]; then
    echo "all right";
else
    echo 'Expected $1 to be "a"'
fi

无论如何,如果您只期望一个答案,那么测试的意义何在?或者你的意思是为了调试目的?

于 2012-08-17T11:04:56.443 回答
1
[[ 'a' = 'a' ]] || echo "failed"
[[ 'b' = 'a' ]] || echo "failed"
failed
于 2012-08-17T11:09:31.677 回答