swift脚本无论是.sh 格式,还是.swift格式,都需要以
#!/usr/bin/env swift
开头,来指定脚本的解释程序。当然,如果执行脚本的时候你指定了解释器,那头部相应的解释器就可以不加了。(使用env指定解释器)
Shell嵌套swift
swift的强大功能和灵活性使它甚至可以在shell脚本中直接运行swift代码,而想要混写只需在头部添加swift解释器。
创建test.sh文件,输入下方所示代码,这个test.sh文件可以像普通的sh脚本一样运行:
#!/usr/bin/env swift
import Foundation
var status :Int = 0
status = 10
print("Status = \(status)")
执行./test.sh
,输出结果为Status = 10
。
你可以在你的脚本里添加更多的swift功能来强壮脚本的功能,甚至可以使用import
引入swift的别的库:
#!/usr/bin/env swift
import Darwin
var status = arc4random_uniform(10)
print("Status = \(status)")
Swift调用shell
swift调用shell指令没有这么简洁了,毕竟swift是高级语言,调用shell指令需要使用对象的方式来实现:
#!/usr/bin/env swift
import Foundation
class Execution{
class func execute(path:String,arguments:[String]? = nil) -> Int {
let task = Process();
task.launchPath = path
if arguments != nil {
task.arguments = arguments!
}
task.launch()
task.waitUntilExit()
return Int(task.terminationStatus)
}
}
var status :Int = 0
status = Execution.execute(path: "/bin/ls")
print("Status = \(status)")
//status = Execution.execute(path: "/bin/ls",arguments:["/"])
//print("Status = \(status)")
- 你可以直接使用
Process
对象来调用shell指令,我这里稍微做了点封装。
稍微解释下代码
- 通过
Process
初始化一个进程对象(只是一个swift对象,此时还没有生成进程),launchPath
设置进程的加载路径,arguments
可以设置需要传给进程的参数。 - 初始并设置完毕后,调用
launch
方法正式开启进程,waitUntilExit
会堵塞当前的swift脚本进程,等待我们创建的进程的任务执行完毕再往下执行。 - 最后我们在终端执行这个swift文件
swift ~/Desktop/test.swift
,输出结果为终端当前所在目录的所有文件(因为执行的是ls
指令)和Status = 0
字符串,其中0表示执行成功。
注意:
- 执行swift脚本需要使用swift命令:
swift ~/Desktop/test.swift
,如果你像示例一样在头部指定了解释器就可以不使用swift命令了,直接使用:~/Desktop/test.swift
来执行。- 如果报错没有执行权限,执行:
chmod +x ~/Desktop/test.swift
,添加执行权限。
网友评论