我正在测试我的erlang escript,escriptis的内容如下:

#!/usr/bin/env escript
main([Action]) ->
    case Action of
        start -> start();
        stop -> stop()
    end;
main(_) ->
    usage().

usage() ->
    io:format("usage: factorial integer\n"),
    halt(1).

start() -> io:format("Start.~n").
stop() -> io:format("Stop.~n").

但当我试图运行escript时,我遇到了一个问题:
./escript start
escript: exception error: no case clause matching "start"

是什么导致了这个问题?论点的格式是错误的吗?

最佳答案

命令行参数作为字符串传递给main/1,而不是atoms,因此需要匹配"start""stop",而不是startstop

...
main([Action]) ->
    case Action of
        "start" -> start();
        "stop" -> stop()
    end;
...

除非您的实际代码更复杂/不同,否则您还可以直接在function子句中匹配["start"]["stop"]
main(["start"]) -> start();
main(["stop"]) -> stop();
main(_) ->
    usage().

当您的原始脚本将崩溃时,这也将为usage()调用./escript foo,这可能是您想要的,也可能不是您想要的。

关于linux - Erlang脚本中的案例表达,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41659947/

10-11 01:44