我想写一个Swift程序
假设代码包含在main.swift中,我们有四种情况:
swift main.swift应该输出“请提供一些input"swift main.swift argument应该输出"argument"echo | swift main.swift应该输出”请提供一些input"echo argument | swift main.swift应该输出“参数”在复合echo argument1 | swift main.swift argument2的情况下,argument2优先。
令人满意的1-3很简单:
import Foundation
var input: String? = nil
if CommandLine.arguments.count > 1 {
input = CommandLine.arguments[1]
}
guard let input = input else {
print("Please provide some input")
exit(0)
}
print(input)但是,echo argument | swift main.swift显然打印了使用消息,因为没有参数。添加一些代码,
import Foundation
var input: String? = nil
if CommandLine.arguments.count > 1 {
input = CommandLine.arguments[1]
} else {
while let line = readLine() {
if input == nil {
if line.isEmpty { break }
input = line
} else {
input! += "\n" + line
}
}
}
guard let input = input else {
print("Please provide some input")
exit(0)
}
print(input)现在案例2-4按预期工作,但案例1是有问题的。readLine()导致执行暂停,等待输入。如果您在没有输入的情况下按“返回”,则返回正确的消息,但我希望避免手动输入空行的必要性。
如何从stdin读取启用读取,而在stdin为空且没有参数时不会导致暂停?
发布于 2019-11-27 00:03:53
我认为问题在于,readLine()只会等待某种输入,即使它只是使用ctrl-d来发送行尾。对于您的使用,是否可以添加一个参数来告诉程序应该等待输入?否则,它就可以假设它不应该等待任何东西?
例如:
import Foundation
func readInput () -> String? {
var input:String?
while let line = readLine() {
if input == nil {
if line.isEmpty { break }
input = line
} else {
input! += "\n" + line
}
}
return input
}
var input: String? = nil
if CommandLine.arguments.count > 1 {
input = CommandLine.arguments[1]
if (input == "-i") {
input = readInput()
}
}
guard let input = input else {
print("Please provide some input")
exit(0)
}
print("input: \(input)")然后您将得到如下所示的使用和输出:

发布于 2019-11-27 01:28:19
乔希·布勒( Josh Buhler )提供了一个缺失的部分--传递一个旗子,以便读取stdin。这是我的最后一个简化的完整解决方案。
import Foundation
guard CommandLine.arguments.count > 1 else {
print("Please provide an argument, or pass - to read stdin")
exit(0)
}
var input = CommandLine.arguments[1]
if input == "-" {
input = AnyIterator { readLine() }.joined(separator: "\n")
}
// do something with input
print(input)https://stackoverflow.com/questions/59060151
复制相似问题