ComputerCraft:在程序中使用shell.run()命令

我正在尝试使用 shell.run() 命令的 (file, parameters) 功能,通过将字符串中的每个单词分配给新变量。我知道如何做到这一点只是通过 tArgs[#]。 在命令行上键入程序名称及其参数并使用 tArgs 进行操作会很好用。但是,我希望在程序内部的提示中这样做。所以场景如下:

1. 计算机使用启动文件启动程序。

2. 使用 “write()” 命令,程序请求运行带有参数的命令。

3. 用户执行 “Echo Yes”。

4. 程序取出单词 “echo” 并给 “var1” 分配, 然后取出单词 “yes” 并赋给 “var2”。

5. 程序需要将 “var1” 和 “var2” 输入到 “shell.run()” 命令中。

6. “shell.run()” 调用名为 “echo” 的程序,它允许使用 “tArgs = {...}” 命令输入参数,而不受提示的影响。 操作系统看到正在输入参数 "yes " 并运行命令: "print(tArgs[1])"

我一直在努力尝试解决这个问题,但无法让它正常工作。以下是我组合的一些代码。

------------------------------------------------------------

-- 1.在 CraftOS 中,启动文件运行一个名为 "cmd" 的程序

[[程序 : 启动]]

shell.run("cmd")

[[结束启动]]

--2. 运行程序 “cmd”

[[程序 : cmd]]

-- 此时正在 cmd 中

term.clear()
term.setCursorPos(1,1)

function prompt()

write(">")--假设用户输入:Echo Yes
tArgs = {...}

file = tArgs[1] --将会得到单词“echo ”
param1 = tArgs[2] --将会得到单词 “yes”

if #tArgs < 1 then

    print(Syntax: <command> <parameters>) --打印错误信息
    prompt()--调用自身
else
    print()
    shell.run((file), (param1)) --结果将是 shell.run("echo","yes")
    print()
    prompt()-- 递归回调 prompt()
end
end

prompt()

[[结束 cmd]]

--3. 运行程序 “echo”,因为它是命令中第一个单词。

[[程序 : echo]]

tArgs = {...}
param = tArgs[1]

print(param)--将打印出 “yes” 这就是 "shell.run((file), (param1))" 调用“echo” 所传递的参数

[[结束 echo]]

在 cmd 中程序的结果应如下所示,这是自定义 shell 的地方。

>echo yes

yes

>

-- 4.因为函数在完成后返回,所以应回到 prompt() 函数中。

非常感谢您的帮助,如果您有任何建议,请提供代码示例,说明如何在程序中使用它。 谢谢!

点赞
用户2902508
用户2902508

在 cmd 文件中,prompt() 函数依赖于传递给程序的参数,因为tArgs={...} 等价于 tArgs=arguments。然而,在 cmd 程序中没有传递任何参数。为了获得输入,需要使用 read() 函数。当然,你仍然需要将其分解成多个单词。

为此,您可以尝试此代码(返回一个表):

function break(str)
    -- 定义变量; ret 是输出; j 是当前索引。
    local ret={""}
    local j=1
    -- 循环遍历字符串
    for i=1,#str do
        -- 提取当前字符
        local char=string.sub(str,i,i)
        -- 检查它是否是空格,上一个字符是否也不是空格。
        if char==" " and ret[j]~="" then
            -- 是空格;继续前进!
            j=j+1
            ret[j]=""
        else
            -- 不是空格;将其添加到字符串中
            ret[j]=ret[j]..char
        end
    end
    return ret
end

代码未经测试,有错误请在评论中报告。 编辑:对代码进行了一些注释。

2014-03-17 15:44:18
用户2694431
用户2694431

看起来您想将用户的输入 "foo bar" 转换为 shell.run(“foo”,“bar”)。如果是这样,您需要将 "foo bar" 字符串分割为表,然后解压该表:

function split(a)
    local result = {}
    for i in a:gmatch("%a+") do
        result[#result + 1] = i
    end
    return result
end
shell.run(unpack(split(read())))

此外,先前答案中的主要问题是使用 break 作为函数名。您无法将其用作变量(或函数)名称,因为 break 是一个实际的语句,将结束在其中调用它的当前 forwhile 循环。 例如:

for i = 1, 10 do
    if i = 5 then
        break
    end
end
2014-06-07 17:01:05