Swift 做脚本语言用

本文演示用Swift作为脚本使用,并简单封装调用系统命令的功能。

1、hello world

创建文件hello.swift

#!/usr/bin/env xcrun swift
print("hello world")

添加可执行属性

chmod +x hello.swift

运行脚本

./hello.swift

咦,好慢呀,需要两秒钟还多。别急!第一次运行需要编译,第二次运行就很快了。

2、调用系统工具

比如我用要调用date "+%y-%m-%d %H:%M:%S"显示日期,可以这么做

#!/usr/bin/env xcrun swift
import Foundation

func exec(_ cmd: String, _ args: [String]? = nil) -> Int {
    let task = Process()
    task.launchPath = cmd
    if args != nil {
        task.arguments = args!
    }
    task.launch()
    task.waitUntilExit()
    return Int(task.terminationStatus)
}

exec("/bin/date", ["+%y-%m-%d %H:%M:%S"])

能正确的输出时间18-04-05 07:01:54
我们这个exec函数不太方便,调用命令的时候要输入完整路径,怎样简短一些呢?
我们再写一个小函数envExec,就可以方便一点了

func envExec(_ args: [String]? = nil) -> Int {
    return exec("/usr/bin/env", args)
}

现在可以这样用:

envExec(["date", "+%y-%m-%d %H:%M:%S"])

还需要加上捕获系统输出和错误输出功能,代码如下:

#!/usr/bin/env xcrun swift
import Foundation

func exec(_ cmd: String, _ args: [String]? = nil) -> (String, String, Int) {
    let task = Process()
    task.launchPath = cmd
    if args != nil {
        task.arguments = args!
    }
    let outpipe = Pipe()
    task.standardOutput = outpipe
    let errpipe = Pipe()
    task.standardError = errpipe
    task.launch()
    let outdata = outpipe.fileHandleForReading.availableData
    let outputString = String(data: outdata, encoding: String.Encoding.utf8) ?? ""
    let errdata = errpipe.fileHandleForReading.availableData
    let errString = String(data: errdata, encoding: String.Encoding.utf8) ?? ""
    task.waitUntilExit()
    return (outputString, errString, Int(task.terminationStatus))
}

func envExec(_ args: [String]? = nil) -> (String, String, Int) {
    return exec("/usr/bin/env", args)
}

let status: Int
let output: String
let err: String
(output, err, status) = envExec(["date", "+%y-%m-%d %H:%M:%S"])
if status == 0 {
    print(output, terminator: "")
} else {
    print(err, terminator: "")
}

试一下,能正常工作。

exec和envExec使用示例:

exec("/bin/ls", ["hello.swift"])
envExec(["ls", "hello.swift"])

返回值有三个,分别是标准输出、错误输出、返回值。
如果返回值为0表示执行成功。

3、总结

上面调用系统命令的方式看起来不够简洁,不如Shell方便,但是你的脚本业务逻辑比较多的情况下Swift的表达能力就比Shell强很多啦!什么?人生苦短,你用Python。好吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,537评论 0 5
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,297评论 1 19
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,280评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,301评论 4 61
  • 【日精进打卡第91天】 【知~学习】 《六项精进》2遍 共153遍 《大学》2遍 共153遍 【经典名句分享】 世...
    大熊和二熊的故事阅读 94评论 0 0