如何让Lua脚本支持管道输入、命令行参数及默认值三种输入方式?
Lua脚本实现三种互斥输入方式
需求是让test.lua支持三种互斥的输入方式:
- 通过管道接收前置命令输出,示例:
echo "value" | lua test.lua - 通过命令行参数传递输入,示例:
lua test.lua "value" - 无输入时使用脚本内的默认值,示例:
lua test.lua
目前已实现方式2和3的最小示例:
local params = { ... } local val = params[1] or "default value"
要实现方式1,可通过io.read("*all")读取标准输入,但直接加入该代码后,无管道输入时脚本会一直等待输入。需要在Lua中检测标准输入是否为空,以此整合三种输入方式,参考C语言实现思路但未找到对应Lua方法。
最终解决方案
通过io.stdin:seek方法判断标准输入是否有内容,最终实现代码如下:
local params = { ... } local val -- 尝试定位到标准输入末尾,判断是否有管道输入 local pipe = io.stdin:seek('end') if pipe then -- 重置指针到开头,读取所有内容 io.stdin:seek('set') val = io.read("*a") else -- 无管道输入时,优先用命令行参数,否则用默认值 val = params[1] or "default" end print(val) -- 测试输出
逻辑说明:io.stdin:seek('end')在标准输入为管道(有内容)时会返回当前位置,而如果是终端交互式输入(无预输入)则会返回nil。利用这一特性区分是否有管道输入,优先处理管道内容,再处理命令行参数,最后使用默认值,实现三种输入方式的互斥。
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

