ComputerCraft:在程序中使用shell.run()命令
2014-3-16 5:14:58
收藏:0
阅读:162
评论:2
我正在尝试使用 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() 函数中。
非常感谢您的帮助,如果您有任何建议,请提供代码示例,说明如何在程序中使用它。 谢谢!
点赞
用户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 是一个实际的语句,将结束在其中调用它的当前 for 或 while 循环。 例如:
for i = 1, 10 do
if i = 5 then
break
end
end
2014-06-07 17:01:05
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
在 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代码未经测试,有错误请在评论中报告。 编辑:对代码进行了一些注释。